雑記帳
2014-09-04 (Thu) [長年日記]
■ [AWS] 最新のAmazon LinuxのAMI IDを取得するワンライナー
AWS CLIのワンライナーシリーズ。本日は、Amazon Linux (hvm, ebs)の最新AMIのAMI IDを取得するもの。
$ aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn-ami-hvm-*' 'Name=virtualization-type,Values=hvm' 'Name=root-device-type,Values=ebs' --query 'Images[].[Name, ImageId]' --output text|sort|tail -n 1 amzn-ami-hvm-2014.03.2.x86_64-gp2 ami-df470ede
ポイントはいくつか。
- ownerをamazonにすることで、Amazon公式のAMIを対象とする。
- filtersで名前をamzn-ami-hvm-*と、ワイルドカードで指定する。
- filtersに複数の条件を指定する(name, root-device-type, virtualization-type)。
- queryで出力される内容を限定する。
- outputをtextにすることで、sortとtailを使って最新のAMIが拾える。JSONは行指向ではないので、シェルでフィルタするときはtextにすると便利。
ちなみに、フィルターに使える条件は、各APIのドキュメントに記載されている。今回の場合は、describe-imagesとなる。Supported Filtersとして、フィルタとして使用できるキーと取りうる値が定義されている。
2014-09-08 (Mon) [長年日記]
■ [Linux] RHEL7でタイムゾーンを変更する
訳あって、ついにRHEL7を触り始めた。さっそくタイムゾーンの変更から、と思って調べてみると、timedatectlというコマンドが用意されているようだ。
現状の確認
# timedatectl status Local time: Mon 2014-09-08 03:32:45 EDT Universal time: Mon 2014-09-08 07:32:45 UTC RTC time: Mon 2014-09-08 07:32:44 Timezone: America/New_York (EDT, -0400) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: yes Last DST change: DST began at Sun 2014-03-09 01:59:59 EST Sun 2014-03-09 03:00:00 EDT Next DST change: DST ends (the clock jumps one hour backwards) at Sun 2014-11-02 01:59:59 EDT Sun 2014-11-02 01:00:00 EST
Asia/Tokyoに変更する
# timedatectl set-timezone Asia/Tokyo
変更した結果
# timedatectl status Local time: Mon 2014-09-08 16:33:27 JST Universal time: Mon 2014-09-08 07:33:27 UTC RTC time: Mon 2014-09-08 07:33:27 Timezone: Asia/Tokyo (JST, +0900) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
これにより /etc/localtime のシンボリックリンクが適切なものに変更されている。
# ls -la /etc/localtime lrwxrwxrwx. 1 root root 32 Sep 8 16:33 /etc/localtime -> ../usr/share/zoneinfo/Asia/Tokyo
以前と同じ方法でも変更はできるが、timedatectlによってより簡単に変更することができるようになったようだ。
■ [Linux][EC2] RHEL7でホスト名を変更する
ホスト名を変更するにも、コマンドが用意されている。
変更前
[root@ip-10-0-0-5 ~]# hostnamectl status Static hostname: ip-10-0-0-5.iret.local Icon name: computer Chassis: n/a Machine ID: 58ab7d423b974a7789b5d487a94d6f94 Boot ID: 6d54614a40b643d3ac0274938d123edd Virtualization: xen Operating System: Red Hat Enterprise Linux Server 7.0 (Maipo) CPE OS Name: cpe:/o:redhat:enterprise_linux:7.0:GA:server Kernel: Linux 3.10.0-123.el7.x86_64 Architecture: x86_64
変更
[root@ip-10-0-0-5 ~]# hostnamectl set-hostname jump --static
変更後
[root@ip-10-0-0-5 ~]# hostnamectl status Static hostname: jump Icon name: computer Chassis: n/a Machine ID: 58ab7d423b974a7789b5d487a94d6f94 Boot ID: 6d54614a40b643d3ac0274938d123edd Virtualization: xen Operating System: Red Hat Enterprise Linux Server 7.0 (Maipo) CPE OS Name: cpe:/o:redhat:enterprise_linux:7.0:GA:server Kernel: Linux 3.10.0-123.el7.x86_64 Architecture: x86_64
ちなみに、EC2の場合は、cloud-initの設定を変更しないと、再起動したときに変更されてしまう。
/etc/cloud/cloud.cfgに、下記の行を追加する。
preserve_hostname: true
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (1)
Active Directory on Windows Server 2012 R2の環境で、Red Hat Enterprise Linx 7をクライアントとして、ユーザ認証を統合してみる。
この手のシステムは実現方法がいくつかあって、自分も過去に複数の方法で構築してきた。
- winbindで認証を行う
- KerberosとLDAPを使って認証を行う
winbindで認証を行う
Sambaを使うときにはwinbindの他に選択肢は無いので使わざるを得ないのだが、過去の自分の経験では、winbindはなぜか唐突にプロセスが死んだり、プロセスが死なないにしても認証が失敗するようになったりして、大変つらいものであった。今回はSambaは使わないので、winbindも使いたくない。
KerberosとLDAPを使って認証を行う
winbindを使わない場合は、KerberosとLDAPを組み合わせて認証を行う設定とする。これはきちんと設定できれば、winbindにくらべて安定して使うことができるのだが、いかんせん、設定が非常に面倒である。特に面倒なのが、Windows Server側にUNIX ID管理ツールを導入して、Active Directory側のスキーマを拡張しなければならない点。そして、Windows Server 2012 R2では、この機能は非推奨になってしまい、GUIでは導入できなくなってしまった(コマンドラインツールを使って入れることは可能)。
今回の目標
以上を踏まえて、今回は下記を目標に構築してみようと思う。
- winbindは使わない
- UNIX ID管理ツールを使ったスキーマ拡張は行わない
これを実現する方法はちゃんと用意されている。最近は、System Security Services Daemon (SSSD)という、クライアントと多岐にわたるIdentity Provider(IdP)の橋渡しをしてくれるツールがあるので、これを使うことにする。
Active Directoryは、最もメジャーなIdPであるため、SSSDはADを単なるKerberos KDCやLDAPサーバではなく、ADとして扱ってくれるようで、設定も比較的容易らしい。
ということで、今回は決意表明だけをして、次回に続く。待て次号! (続きを書きました)
2014-09-09 (Tue) [長年日記]
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (2)
2014-09-29追記: RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (5)にて、samba-clientの代わりに、realmdを使ってドメインに参加する方法を追記。realmdを使ったほうが楽なのでオススメ。
前回示した構成での構築を進めていく。対象となる環境はAWSで、VPCを用意して、そこにActive Directory Domain Serviceを構成する。
ちなみに、VPC上にActive Directoryを構築する方法については、Active Directory on AWSが大変参考になる。
構築したADの情報
今回は、下記のような構成でADを用意した。
- ドメイン名は、example.localとする。NetBIOS名はEXAMPLEとなる。
- 複数AZにそれぞれ一台ずつADサーバを用意する。
- ad1.example.local (10.0.2.4)
- ad2.example.local (10.0.130.4)
- DHCP Option Setで、VPC内の名前解決をADサーバでできるように設定しておく。
netbios-node-type = 2 ntp-servers = 10.0.2.4, 10.0.130.4 domain-name = exmaple.local domain-name-servers = 10.0.2.4, 10.0.130.4 netbios-name-servers = 10.0.2.4, 10.0.130.4
以上のような環境に、Red Hat Enterprise Linux 7(RHEL7)を追加して、ユーザ認証をADでできるようにする。
基本設定
認証まわりの設定をする前の、前提となるいくつかの基本的な設定を行う。
ホスト名の設定
RHEL7でホスト名を変更するの手順に従って、ホスト名を適切なものに変更する。
# hostnamectl set-hostname linux1 --static # vim /etc/cloud/cloud.cfg preserve_hostname: true # 追記
時計を調整する
タイムゾーンをJSTに変更したり、ADサーバと同期させたりする。NTPについては、ADやVPCの設定が適切に設定されていれば、特に追加の設定はいらないはず。
各種パッケージのインストール
今回必要となるパッケージは以下のとおり。
- sssd, sssd-ad
- RHEL7には、SSSDのパッケージが用意されているので、それを導入する。sssd-adという、Active Directoryに対応するパッケージがあるので、それも入れる。
- krb5-workstation
- 認証にKerberosを使用するため、Kerberos関連のパッケージを入れる。
- samba-client
- ドメインに参加する際に、netコマンドを使用するので入れる。
- oddjob-mkhomdir
- ドメインユーザがログインした時に、自動的にホームディレクトリを作成してくれるツールも入れる。
ということで、下記のコマンドを実行してインストールする。
# yum -y install sssd sssd-ad krb5-workstation samba-client oddjob-mkhomedir
Kerberosの設定
/etc/krb5.confの、libdefaultsセクションを、下記のように設定する。
[libdefaults] dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false default_realm = EXAMPLE.LOCAL default_ccache_name = KEYRING:persistent:%{uid}
Sambaの設定
ドメインに参加する目的でnetコマンドを使用するため、/etc/samba/smb.confのglobalセクションを下記のように設定する。
[global] workgroup = EXAMPLE client signing = yes client use spnego = yes kerberos method = secrets and keytab security = ads realm = EXAMPLE.LOCAL password server = AD1.EXAMPLE.LOCAL AD2.EXAMPLE.LOCAL
Kerberosの初期化
kinitを実行して、TGTを取得する。指定するアカウントは、ADのドメイン管理者を指定する。
# kinit Administrator Password for Administrator@EXAMPLE.LOCAL:
ドメインに参加
net ads joinを実行して、ドメインに参加する。
# net ads join -U administrator Enter administrator's password: Using short domain name -- EXAMPLE Joined 'LINUX1' to dns domain 'example.local' No DNS domain configured for jump. Unable to perform DNS Update. DNS update failed: NT_STATUS_INVALID_PARAMETER
"Joined 'LINUX1' ... と出力されているので、ドメインに参加できている。その下に出力されているエラーは、DNSの動的更新に失敗したというエラーになる。今回やることに影響がないので、とりあえず放っておく。これについては別途解決する予定。
ここまでで、ADドメインへの参加ができた。ちょっと長くなってきたので今回はここまでとする。待て次号!
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (3)
前回は、ドメインの参加まで実現したので、実際に認証ができるように設定をすすめていく。
SSSDの有効化
authconfigコマンドを使って、SSSDを使うように設定する。また、合わせてmkhomedirも有効化する。
# authconfig --enablesssd --enablesssdauth --enablemkhomedir --update
SSSDの設定
/etc/sssd/sssd.confを、下記のように設定する。
[sssd] config_file_version = 2 domains = example.local services = nss, pam, pac [domain/example.local] id_provider = ad ad_server = ad1.example.local,ad2.example.local ad_hostname = ad1.example.local,ad2.example.local auth_provider = ad chpass_provider = ad access_provider = ad ldap_schema = ad ldap_id_mapping = True cache_credentials = true ldap_access_order = expire ldap_account_expire_policy = ad ldap_force_upper_case_realm = true
sssd.confのパーミッションを下記のように設定する。
# chown root:root /etc/sssd/sssd.conf # chmod 0600 /etc/sssd/sssd.conf
パスワード認証でSSHできるように、設定を変更する。
# vim /etc/ssh/sshd_config PasswordAuthentication yes # 変更
ここまで設定した後、sshdと、sssdを再起動する。
# systemctl restart sshd.service # systemctl restart sssd.service
これで、認証する準備は整ったはず。
まずは、ユーザの情報が引けるか確認してみる。テストでaduserという名前のユーザを作って、確認してみる。
$ id aduser uid=1436601105(isobe) gid=1436600513(domain users) groups=1436600513(domain users),1436600512(domain admins),1436600572(denied rodc password replication group)
情報がとれた!
uidはsssdによって自動的にマッピングされている。従来は、UNIX ID管理を使って、UNIXシステム側のuidを手作業でマップしなければならなかったが、sssdが勝手にやってくれている。
それでは、sshでログインしてみよう。
% ssh aduser@xx.yy.zz.100 aduser@xx.yy.zz.100's password: -sh-4.2$ pwd /
Active Directoryで登録したパスワードでログインできた!
ただし、現時点ではホームディレクトリが存在していないため、/にchdirした状態になっている。これについては、すでに導入しているmkhomedirを使って設定できる。それについては次回に続く。待て次号!
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (4)
前回までで、認証はできるようになったが、ログインしたユーザのホームディレクトリが無いという問題があったので、それの対応などを行う。
SSSDの設定を追加
すでに導入済みとなる、oddjob_mkhomedirの設定を、/etc/sssd/sssd.confに追記する。
[domain/example.local] override_homedir = /home/%d/%u [nss] fallback_homedir = /home/%u
%dは、ドメイン名、%uはユーザ名が補間されて、初回ログイン時に自動的にディレクトリが作成されるようになる。
設定を変更したら、sssdを再起動する。
# systemctl restart sssd.service
それでは、再度ログインしてみる。
% ssh aduser@xx.yy.zz.100 aduser@xx.yy.zz.100's password: Creating home directory for aduser. Last login: Tue Sep 9 16:10:25 2014 from xxx.yyy.zzz.241 [aduser@linux1 ~]$ pwd /home/example.local/aduser
想定通り、ホームディレクトリが作成された。
デフォルトのシェルを指定する
ADドメインユーザは、LDAPv3スキーマのloginShell属性でシェルの定義を行う。しかし、AD側で一々設定するのは面倒なので、SSSD側の設定で実現する。
[domain/example.local] default_shell = /bin/bash [nss] shell_fallback = /bin/sh allowed_shells = /bin/bash
ちなみに、/etc/passwdにエントリが無いため、chshを実行してもシェルを変更できない。
[aduser@linux1]~% chsh aduser のシェルを変更します。 新しいシェル [/bin/zsh]: /bin/bash パスワード: chsh: user "aduser" does not exist.
とりあえず、ユーザがADで認証してSSHログインできるところまでできた。
■ [Linux] bashの実行結果をsyslogに出力する(RHEL7)
HistoryをSyslogに出力BashのRPMを作ってみた(CentOS6)を参考に、RHEL7でも実践した。
必要なパッケージのインストール
# yum -y install rpm-build texinfo bison ncurses-devel autoconf gettext gcc make yum-utils
bashのsrc.rpmのダウンロード
# yumdownloader --source bash Loaded plugins: amazon-id, rhui-lb Enabling rhui-REGION-rhel-server-releases-source repository rhui-REGION-rhel-server-releases-source | 2.9 kB 00:00:00 rhui-REGION-rhel-server-releases-source/7Server/x86_64/primary_db | 665 kB 00:00:00 rhui-REGION-rhel-server-releases-source/7Server/x86_64/updateinfo | 74 kB 00:00:00 bash-4.2.45-5.el7.src.rpm | 6.8 MB 00:00:00
src.rpmの展開
# rpm -Uvh bash-4.2.45-5.el7.src.rpm
bash.specの編集
# cd rpmbuild/SPECS/ # vim bash.spec # makeのCPPFLAGSに、-DSYSLOG_HISTORYを追加 make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' -DSYSLOG_HISTORY `getconf LFS_CFLAGS`"
rpmのビルド
# rpmbuild -ba bash.spec
できた。
# cd ../RPMS/x86_64/ # ls -l total 3708 -rw-r--r--. 1 root root 1030568 Sep 9 19:42 bash-4.2.45-5.el7.x86_64.rpm -rw-r--r--. 1 root root 1509088 Sep 9 19:42 bash-debuginfo-4.2.45-5.el7.x86_64.rpm -rw-r--r--. 1 root root 1253056 Sep 9 19:42 bash-doc-4.2.45-5.el7.x86_64.rpm
rpmのインストール
# rpm -Uvh bash-4.2.45-5.el7.x86_64.rpm --force
ログに出力されるかのテスト
ADドメインのユーザでログインしなおして、適当にコマンドを実行してみる。
Sep 9 19:44:47 linux1 -bash: HISTORY: PID=28661 UID=1436601105 cat /var/log/messages Sep 9 19:44:50 linux1 -bash: HISTORY: PID=28661 UID=1436601105 exit
このbashのみインストールしたシステムでは、ユーザはシェルを変更することが出来ないので、全ての実行したコマンドがロギングされるということになる。
UIDについて
ちなみに、自動的にマッピングされるUIDは、ADユーザのsidからハッシュ化されて生成されるようだ。AD側のSIDが同じであれば、Linux側のUIDも同じになることが期待できるので、複数サーバに展開しても、UIDは同一のものが利用される。
■ [AWS][Windows] EC2のWindows Server 2008以降はインスタンスの再起動を行うとタイムゾーンがUTCにリセットされる、その対処法
一連のActive Directoryの構築と検証を行なっている時に、あるタイミングから"Preauthentication failed"というエラーがでて、ADドメインユーザでログインができなくなってしまった。色々と調べていたら、ADサーバのタイムゾーンが、JSTからUTCに戻ってしまっていることが分かり、JSTに再設定したところ、問題が解消された。
なぜタイムゾーンがUTCに戻ったんだろうと疑問に思ってつぶやいたら、mayukiより、アドバイスをもらった。
@muramasa64 AWSでインスタンス再起動とかしてません? http://t.co/skwxYOcjag
— Mayuki Sawatari (@mayuki) 2014, 9月 9
まさにその通りで、インスタンスをstop & startを実施したりしていた。このドキュメントによると、この動作を抑止することができるようなので、設定を行う。
コマンドプロンプトを開き、下記のコマンドを実行すれば良い。
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
結果を確認したければ、下記のコマンドを実行して出力を確認する。RealTimeIsUniversalの値が、REG_DWORDで1になっている。
reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /s HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation DaylightBias REG_DWORD 0x0 DaylightName REG_SZ @tzres.dll,-631 StandardStart REG_BINARY 00000000000000000000000000000000 StandardBias REG_DWORD 0x0 StandardName REG_SZ @tzres.dll,-632 Bias REG_DWORD 0xfffffde4 DaylightStart REG_BINARY 00000000000000000000000000000000 TimeZoneKeyName REG_SZ Tokyo Standard Time DynamicDaylightTimeDisabled REG_DWORD 0x0 ActiveTimeBias REG_DWORD 0x0 RealTimeIsUniversal REG_DWORD 0x1
これで問題ないようだ。
2014-09-12 (Fri) [長年日記]
■ [Linux] SSHの認証でワンタイムパスワードを使う(導入編)
最近、様々なサービスでRFC 4226とRFC 6238で定義されているワンタイムパスワードが利用されるようになってきている。このワンタイムパスワードを、SSHでLinuxにログインする際に使えるということを知ったので、試したみた。対応しているOpenSSHは、6.2以降となる。
なお、今回はAmazon Linux 2014.03を対象とする。
Google Authenticatorをインストールする
Google Authenticatorは、PAMモジュールとして使えるものが提供されているので、そちらをインストールする。Amazon Linuxの場合は、なんとパッケージが用意されているので、yumで導入できる。
$ sudo yum -y install google-authenticator
sshdの設定を変更する
公開鍵認証に加えて、キーボード入力による認証を有効にする。
ChallengeResponseAuthentication yes AuthenticationMethods publickey,keyboard-interactive
認証に問題があってログインできなくなると困るので、公開鍵認証のみでログインできるアカウントを作っておくと吉。たとえば、ec2-userの場合は下記のように設定する。
Match User ec2-user AuthenticationMethods publickey PubkeyAuthentication yes PasswordAuthentication no
設定に問題ないことを確認。
$ sudo sshd -t
何も出力されなければ問題ない。再起動する。
$ sudo /sbin/service sshd restart
PAMの設定を変更する
新しく、Google Authenticator用の設定ファイルを追加する。
$ sudo vim /etc/pam.d/google-auth
中身は、下記のようにする。
#%PAM-1.0 auth required pam_env.so auth sufficient pam_google_authenticator.so try_first_pass auth requisite pam_succeed_if.so uid > 500 quiet auth required pam_deny.so
/etc/pam.d/sshd のauth password-authの部分をgoogle-authに置き換える。
#%PAM-1.0 auth required pam_sepermit.so auth substack google-auth account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session optional pam_keyinit.so force revoke session include password-auth
インストールは以上。
ワンタイムパスワードの設定
今回は、ec2-userとは別にローカルユーザを作成して、そのユーザで設定する。
まず、ユーザを作成して、公開鍵認証の準備をする。
# useradd authtest # su - authtest $ ssh-keygen -t rsa -b 2048 Generating public/private rsa key pair. ...
作成したユーザで、Google Authenticatorコマンドを実行する。
$ google-authenticator Do you want authentication tokens to be time-based (y/n) y https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/authtest@hostname%3Fsecret%3Dxxxxxxxxxxxxxxxx Your new secret key is: xxxxxxxxxxxxxxxx Your verification code is 604823 Your emergency scratch codes are: 68011691 65800690 17733786 49174305 65882469 Do you want me to update your "/home/authtest/.google_authenticator" file (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n) y If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y
ここで表示されるURLにアクセスすると、スマホに入れる方のGoogle Authenticatorで読み込める2次元コードが表示されるので、スキャンする。
ログインする
以上で設定が完了したので、ログインしてみる。
% ssh authtest@xx.xx.xxx.xxx Authenticated with partial success. Verification code: Last login: Tue Sep 12 13:01:35 2014 __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/ [authtest@ip-xx-x-xxx-xx ~]$
まず"Authenticated with partial success."と出力され、公開鍵認証が成功したことが表示される。その後、"Verification code:"とプロンプトが表示されるので、スマホの方のGoogle Authenticatorに表示されるワンタイムパスワードを入力すると、ログインできる。
今回の手順は、OpenSSHによる二段階認証について ワンタイムパスワード編を参考にいたしました。感謝します。
2014-09-29 (Mon) [長年日記]
■ [AWS] AWS CLIでセキュリティグループのルールをコピーする
いつも、セキュリティグループのルールをコピーしたいと思っているのだが、今のAWS CLIであれば、以前にやったRDSのパラメータグループをコピーしたのと同じ方法でできるのではないかと思ったので、やってみた。
$ aws ec2 describe-security-groups \ --filters 'Name=group-name,Values=src-sg' \ --query 'SecurityGroups[].IpPermissions[]' \ | tr -d '\d' \ | xargs -I{} -- aws ec2 authorize-security-group-ingress --group-id sg-deadbeaf --ip-permissions '{}' A client error (MissingParameter) occurred when calling the AuthorizeSecurityGroupIngress operation: Missing source specification: include source security group or CIDR information
エラーになってしまった。色々調べてみたら、以下の様な原因であることがわかった。
describe-security-groupsで取得したJSONには、IpRangesとUserIdGroupPairsの両方が項目として含まれている。セキュリティグループのルールは、対象としてCIDRを渡す他に、他のセキュリティグループを指定することができる。IpRangesには、IPアドレスが、UserIdGroupPairsには、セキュリティグループのIDが含まれる。
しかし、一つのルールにそれらが同時に含まれることはない。下記は、80/tcpを、IPアドレスとセキュリティグループを指定して定義したセキュリティグループのルールを取得したJSONの出力。別々のルールとして出力されていることが分かる。
% aws ec2 describe-security-groups --group-id 'sg-deadbeaf' --query 'SecurityGroups[].IpPermissions[]' [ { "ToPort": 80, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "192.0.2.1/32" } ], "UserIdGroupPairs": [], "FromPort": 80 }, { "ToPort": 80, "IpProtocol": "tcp", "IpRanges": [], "UserIdGroupPairs": [ { "UserId": "nnnnnnnnnnnn", "GroupId": "sg-cafebabe" } ], "FromPort": 80 } ]
authorize-security-group-ingressに渡す前に、値が含まれていない項目を除去すれば使うことができる。ということで、ちょっとしたフィルタを作った。
このフィルタを通すと、IpRangesまたはUserIdGroupPairsのうち、値が含まれていない項目を削除してくれる。また、xargsで処理しやすいように、1ルール1行に変換する。
% aws ec2 describe-security-groups --group-id 'sg-deadbeaf' --query 'SecurityGroups[].IpPermissions[]' | ruby ./repos/sgfilter/sgfilter.rb '{"ToPort":80,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"1n2.0.2.1/32"}],"FromPort":80}' '{"ToPort":80,"IpProtocol":"tcp","UserIdGroupPairs":[{"UserId":"nnnnnnnnnnnn","GroupId":"sg-cafebabe"}],"FromPort":80}'
これを使って、下記のように、xargsを使って実行する。
$ aws ec2 describe-security-groups \ --filters 'Name=group-name,Values=src-sg' \ --query 'SecurityGroups[].IpPermissions[]' \ | ruby sgfilter.rb \ | xargs -I{} -- aws ec2 authorize-security-group-ingress --group-id sg-deadbeaf --ip-permissions '{}'
これで、src-sgに含まれる許可ルールが、sg-deadbeafに対してコピーされることになる。
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (5)
前回までのあらすじ
- RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (1)
- 認証システムの方針について
- RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (2)
- 初期構築からドメインへの参加まで
- RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (3)
- ユーザのログイン
- RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (4)
- ホームディレクトリの自動作成とシェルの指定
realmdを使って(Sambaを使わないで)設定する
RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (2)では、samba-clientパッケージをいれてドメインへの参加を実施していた。実際にはSambaを使わないのに、samba-clientを入れるのがダメな感じであるので、新しい手段として、realmdを使ってのドメインの参加を試してみた。
パッケージの導入
RHEL7であれば、yumでインストールできる。
# yum -y install realmd
Active Directoryの情報取得(確認)
まだ、Kerberosやsssd、Sambaなどの設定をしていない状態で、realm discoverコマンドを実行して、ADの情報が取れるか確認する。
# realm discover --verbose * Resolving: _ldap._tcp.example.local * Performing LDAP DSE lookup on: 10.0.2.4 * Performing LDAP DSE lookup on: 10.0.130.4 * Successfully discovered: example.local example.local type: kerberos realm-name: EXAMPLE.LOCAL domain-name: example.local configured: no server-software: active-directory client-software: sssd required-package: oddjob required-package: oddjob-mkhomedir required-package: sssd required-package: adcli required-package: samba-common
DHCP Options Setの設定で、DNSがADサーバに向いていれば、そこから情報を取得することができる。
required-packageとして出力されているパッケージを導入する。
# yum -y install oddjob oddjob-mkhomedir sssd adcli samba-common
どうやら、samba-commonはどうしても必要になってしまうようだ。
realmd設定
ほとんどデフォルトの設定のままではあるが、/etc/realmd.confに下記の設定を追加する。
# cat /etc/realmd.conf [users] default-home = /home/%D/%U default-shell = /bin/bash [active-directory] default-client = sssd [service] automatic-install = yes [example.local] computer-ou = OU=Computers,DC=example,DC=local automatic-id-mapping = yes fully-qualified-names = no
ドメインへの参加
realm joinコマンドで、ドメインに参加する。
# realm join example.local Password for Administrator:
これで、ドメインに参加できた。
前回行った、Kerberos, SSSDの設定については、すでに自動的に更新されている。また、Sambaの設定は不要となる。あとは、RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (3)の、SSSDの設定が完了したところから、設定を続ければ良い。