最新 追記

雑記帳


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より、アドバイスをもらった。

まさにその通りで、インスタンスを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 4226RFC 6238で定義されているワンタイムパスワードが利用されるようになってきている。このワンタイムパスワードを、SSHでLinuxにログインする際に使えるということを知ったので、試したみた。対応しているOpenSSHは、6.2以降となる。

参考
OpenSSH 6.2 adds support for two-factor authentication

なお、今回は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による二段階認証について ワンタイムパスワード編を参考にいたしました。感謝します。

続き → SSHの認証でワンタイムパスワードを使う(ログインするたびに何度も入力するのが嫌な人への対策編)


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の設定が完了したところから、設定を続ければ良い。