Amazon LinuxのOSアカウントをSimple AD(AWS Directory Service)で管理する

2016.04.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。Windows OSだけでなく、Linux OSもドメイン連携することで、OSアカウントの集約管理が可能です。以前にもご紹介した内容ですが、設定していく上での注意事項がいくつかあるので、まとめてみたいと思います。

事前準備の注意

Microsoft ADを利用する場合でもドメイン連携の手順はほとんど変わらないと思いますが、アカウント管理のみを利用するのであれば、Simple ADのみで十分なので今回はこちらを利用します。Microsoft ADでも手順をほとんど変えずに利用できると思いますが、未検証ですので悪しからず。

Simple ADとの通信ポート開放

Simple ADとドメイン連携するサーバ間で、必要な通信ポートを開放する必要があります。

  • TCP/UDP 53 - DNS
  • TCP/UDP 88 - Kerberos authentication
  • UDP 123 - NTP
  • TCP 135 - RPC
  • UDP 137-138 - Netlogon
  • TCP 139 - Netlogon
  • TCP/UDP 389 - LDAP; note that AWS Directory Service does not support LDAP with SSL (LDAPS)
  • TCP/UDP 445 - SMB
  • TCP 873 - FRS
  • TCP 3268 - Global Catalog
  • TCP/UDP 1024-65535 - Ephemeral ports for RPC

詳しくは公式ドキュメントをご確認ください。

Simple ADと同一VPC内のOSをドメイン連携させる場合にはデフォルト設定で問題ありませんが、Internet VPN接続やVPC Peeringを介して接続する必要がある場合には、AWS Directory Service側に割り当てられたSecurity Groupも編集が必要となる場合があります。AWS Directory Serviceの画面には、Security Group設定の画面は存在しないので注意が必要です。用途は異なりますが、下記記事でSimple AD用のSecurity Groupを編集する手順をご紹介していますので、参考にしていただければと思います。

DNSクライアント設定

Simple ADと連携させる為に、各OSのDNSクライアントが参照するDNSサーバを、Simple ADが提供するDNSサーバに向ける必要があります。方法は2種類ありますので、要件に合わせて変更してください。

  • DHCP Options set利用
  • VPC全体のDNSサーバを変更して問題が無い場合はこちらを利用した方が簡単
  • resolv.confを編集
  • 各OS上の/etc/resolv.confを編集してDNSサーバを手動指定
  • DHCPから上書きされないように、PEERDNSオプションをnoに設定することもお忘れなく

PEERDNSオプションについては、下記記事で詳しく説明されています。

ADユーザ・グループの管理サーバを用意する

ADユーザやADグループを管理する為のサーバを用意します。Windowsサーバをドメイン参加させて、RSAT(Remote Server Administration Tools)を導入しておきましょう。手順は公式ドキュメントにも記載されています。

"AD DS and AD LTS Tools"があれば十分ですが、念の為、"DNSサーバツール"や"グループポリシーの管理"も導入しておくことで、DNS操作やグループポリシー操作(※一部パスワードポリシーのみ変更可能)が可能となります。

AD管理における注意事項

Windows Server 2012 R2のActive Directoryユーザとコンピュータ(ADUC)からは、ユーザ追加ができないという制約がありますので、ご注意ください。

There is an incompatibility between the Simple AD directory and the Active Directory Users and Computers tool on Windows Server 2012 R2 that causes user creation to fail. We are working to correct this incompatibility. You can still use the tools on Windows Server 2012 R2 for other tasks, such as managing group policy. However, you should create your users from a Windows Server 2008 R2 instance. Installing the Active Directory Administration Tools - AWS Directory Service

また、Simple ADでは、PowerShellコマンドレットからの操作もできません。

  • Simple ADでサポートされない機能
  • スキーマ拡張
  • MFA
  • LDAPS通信
  • PowerShell ADコマンドレット
  • FSMOロール転送

Note that you cannot set up trust relationships between Simple AD and other Active Directory domains. Other common features not supported today by Simple AD include schema extensions, multi-factor authentication, communication over LDAPS, PowerShell AD cmdlets, and the transfer of FSMO roles. What Is AWS Directory Service? - AWS Directory Service

で、Windows Server 2008をAD管理の為だけに用意するのもいただけないので、他に方法が無いか検証していたところ、Windows Server 2012 R2からもADユーザを追加する手順を見つけました(非公式)。

> set NEWUSER=testuser
> net user %NEWUSER% XXPass1234XX /add /domain

この要求はドメイン simplead.local のドメイン コントローラーで処理されます。
コマンドは正常に終了しました。

昔ながらのnetコマンドでは互換性の問題が発生しないようです。検証ベースの結果ではありますが、こちらを利用すれば余分なWindowsサーバを構築する必要は無さそうです。また、下記記事ではLinuxからのSimple AD上のアカウント管理手順も紹介されています。アカウントの管理さえできれば良いので、どの方式を採用しても問題はありません。ユーザの改廃やグループへの追加・削除ができるようにしておきましょう。

ドメイン参加作業用のアカウントを用意する

各OSをドメイン参加させる為に、毎度Domain Admins権限を利用するのもいただけません。サーバ構築担当者には、コンピュータオブジェクトの改廃のみ権限を付与し、ユーザオブジェクトの管理とは分離しておきましょう。公式ドキュメントに丁寧な手順が記載されています。以降の手順では、osadminというアカウントを用意してドメイン参加手順を説明していきます。

Amazon Linuxをドメイン連携させる

事前の準備が整ったら、Amazon Linuxのアカウントもドメイン連携させましょう。1度この設定をしておけば、アカウントの改廃は原則Simple AD側だけで管理することができるはずです。

前提パッケージをインストール

ドメイン参加するLinuxサーバには下記パッケージ追加が必要です。

$ sudo yum -y install sssd realmd krb5-workstation

パスワード認証でssh接続可能にする

セキュリティ強度が下がってしまいますが、前述の通りSimple ADではスキーマ拡張がサポートされていない為、ユーザのSSH公開鍵を連携することは難しそうです。もう少し調査しようと思っていますので、何かわかればまたブログ 化しようと思います。ひとまずここでは、SSH接続元をSecurity Groupで必要最低限に絞った上で、パスワード認証を許可しておきます。

$ sudo sed -i -e 's/^PasswordAuthentication .*$/PasswordAuthentication yes/g' /etc/ssh/sshd_config
$ sudo service sshd restart

ドメイン参加

ドメイン参加は以前の記事でもご紹介した通りです。これまでの手順が全てクリアできていれば、スムーズにドメイン連携できるはずです。

[ec2-user@longhostname0123 ~]$ sudo realm join -U osadmin@simplead.local simplead.local --verbose

  * Resolving: _ldap._tcp.simplead.local
 * Performing LDAP DSE lookup on: 172.31.37.196
 * Performing LDAP DSE lookup on: 172.31.23.35
 * Successfully discovered: simplead.local
osadmin@simplead.local に対するパスワード:
 * Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
 * Joining using a truncated netbios name: LONGHOSTNAME012
 * LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.VSI5EY -U osadmin@simplead.local ads join simplead.local
Enter osadmin@simplead.local's password:DNS update failed: NT_STATUS_INVALID_PARAMETER

Using short domain name -- SIMPLEAD
Joined 'LONGHOSTNAME012' to dns domain 'simplead.local'
No DNS domain configured for longhostname012. Unable to perform DNS Update.
 * LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.VSI5EY -U osadmin@simplead.local ads keytab create
Enter osadmin@simplead.local's password:
 * /sbin/chkconfig sssd on
 * /sbin/service sssd restart
Stopping sssd: cat: /var/run/sssd.pid: No such file or directory
[FAILED]
Starting sssd: [  OK  ]
 * /bin/sh -c /usr/sbin/authconfig --update --enablesssd --enablesssdauth --enablemkhomedir --nostart && /sbin/chkconfig oddjobd on && /sbin/service oddjobd start
getsebool:  SELinux is disabled
Starting oddjobd: [  OK  ]
 * Successfully enrolled machine in realm

Simple ADは、DNS動的更新を許していない為、DNS更新系のエラーは無視して問題ありません。名前解決も利用したい場合には、DNSツールを導入して手動でレコード登録をしてください(Simple ADのDNSサーバへの手動登録は、Aレコードのみサポート)。

ドメイン参加時の注意

前述のコマンド結果をよく読むとわかりますが、Simple ADと連携する際のOSホスト名は15文字までに切り捨てられてしまいます。Windows関連のサービスとの連携では、未だにOSホスト名を15文字までにしておいた方が安全なようです。重複が無ければ問題はありませんが、先頭15文字までが同じ2台以上のサーバをドメイン参加させようとすると、ドメインコントローラ側が管理しているサーバを特定できず、認証が正しく動作しなくなってしまいます。私が試した環境では、/var/log/messagesに下記のログが多数出力されていました。

エラーログサンプル

Mar 25 20:30:30 longhostname0123 [sssd[krb5_child[15910]]]: Preauthentication failed

任意のNetBIOS名でドメイン連携させる手順

realmコマンド経由ではNetBIOS名を変更することができなかった為、手動での作業が必要でしたが、下記の手順でドメイン参加させることに成功しました。ドメイン名はsimplead.localとしていますので、環境に合わせて変更して試してみてください。smb.confnetbios nameに任意のNetBIOS名を指定します。

$ cat << EOF | sudo tee /etc/samba/smb.conf
[global]
   workgroup = SIMPLEAD
   client signing = yes
   client use spnego = yes
   kerberos method = secrets and keytab
   log file = /var/log/samba/%m.log
   realm = SIMPLEAD.LOCAL
   security = ads
   netbios name = shortname1
EOF

$ cat << EOF | sudo tee /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = SIMPLEAD.LOCAL
[realms]
 SIMPLEAD.LOCAL = {
 }

[domain_realm]
 simplead.local = SIMPLEAD.LOCAL
 .simplead.local = SIMPLEAD.LOCAL
EOF

この状態で、netコマンドでドメイン連携させます。ここでもDNS更新に関するエラーが出ますが、ドメイン参加には成功しています。

$ sudo net ads join -U osadmin
Enter osadmin's password:
Using short domain name -- SIMPLEAD
Joined 'SHORTNAME1' to dns domain 'simplead.local'
No DNS domain configured for shortname1. Unable to perform DNS Update.
DNS update failed: NT_STATUS_INVALID_PARAMETER

sssd設定ファイルを編集して、relamコマンドによるドメイン連携時の出力に合わせて、ドメインアカウントと連携してPAM認証できるようにしてあげます。

$ cat << EOF | sudo tee /etc/sssd/sssd.conf

[sssd]
domains = simplead.local
config_file_version = 2
services = nss, pam

[domain/simplead.local]
ad_domain = simplead.local
krb5_realm = SIMPLEAD.LOCAL
realmd_tags = manages-system joined-with-samba 
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_sasl_authid = shortname1
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = simple
EOF

$ sudo chmod 600 /etc/sssd/sssd.conf
$ sudo chkconfig sssd on && sudo service sssd start
Starting sssd:                                             [  OK  ]
$ sudo authconfig --update --enablesssd --enablesssdauth --enablemkhomedir --nostart && sudo chkconfig oddjobd on && sudo service oddjobd start
getsebool:  SELinux is disabled
Starting oddjobd:

ログイン可能なADセキュリティグループを登録

realmコマンド経由でAD参加させた場合は、下記コマンドでログイン可能なグループを制限しておきます。デフォルトでは、全てのドメイン上のアカウントがOSログイン可能な状態となってしまいますので、必ずログインできるユーザまたはグループを制限する設定をしておきましょう。

$ sudo realm permit --groups "osadmins@simplead.local" --verbose
 * /sbin/service sssd restart
Stopping sssd: [  OK  ]
Starting sssd: [  OK  ]

前述のNetBIOS名でAD参加させる手順だと、realm permitがエラーとなってしまったのですが、手動でsssd.confを編集すれば問題ありませんでした。

$ echo "simple_allow_groups = osadmins@simplead.local" | sudo tee -a /etc/sssd/sssd.conf
$ sudo service sssd restart
Stopping sssd: [  OK  ]
Starting sssd: [  OK  ]

※必要に応じてコンマ区切りで指定してください

まとめ

Simple ADアカウントによるsshログイン確認は割愛しましたが、Amzon LinuxをSimple ADに連携させる手順の注意事項をまとめてみました。LinuxのAD連携用のパッケージも各種あり、ソフトウェアのバージョン等により、まだ手順が定まっていないような印象があるのも正直なところではあります。Linuxをドメイン連携させる実現手順は他にもありそうなので、良い方法があればぜひご連絡ください。

本記事がどこかの誰かのお役に立てば嬉しいです。