«前の日記(2014-09-12 (Fri)) 最新 次の日記(2014-10-01 (Wed))» 編集

雑記帳


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