LinuxのユーザーをActive Directoryで管理する方法です。
複数台での共通のユーザーを管理したい場合などに使えます。
環境
- AD (AWS Directory Service for Microsoft Active Directory)
- AmazonLinux2 on EC2
- WindowsServer2019 on EC2 (AD管理用)
鍵認証を行うためにはADのスキーマ拡張が必要だったため、SimpleADではなく、Microsoft Active Directoryを使っています。
(SimpleADでも頑張ればできそうな記事もあったけ途中で挫折...)
https://github.com/localytics/chef-sssd/blob/master/GETTING_STARTED.md
https://teratail.com/questions/153872
WindowsServerはADのユーザー作成/削除で利用するので、普段は停止にしておいてOKです。
AWS Directory Service for Microsoft Active Directoryの準備
ADのタイプはAWS Mabager Microsoft ADを選択します。
エディションは規模に応じて選択してください。
今回はディレクトリのDNS名はad.localとします。
Adminパスワードは任意のものを入れてください。
ADを立てたいVPCとサブネットを選択します。冗長構成となるためサブネットが2つ以上あるVPCが必要です。
ADがアクティブになったら拡張スキーマを登録します。作成したディレクトリIDをクリックします。
メンテナンスタブのスキーマ拡張のアクションからスキーマをアップロードします。
アップロードするスキーマは以下です。
dn: CN=sshPublicKey,CN=Schema,CN=Configuration,DC=ad,DC=local
changetype: add
objectClass: top
objectClass: attributeSchema
attributeID: 1.3.6.1.4.1.1466.115.121.1.40
cn: sshPublicKey
name: sshPublicKey
lDAPDisplayName: sshPublicKey
description: Users public SSH key
attributeSyntax: 2.5.5.5
oMSyntax: 22
isSingleValued: FALSE
dn: CN=ldapPublicKey,CN=Schema,CN=Configuration,DC=ad,DC=local
changetype: add
objectClass: top
objectClass: classSchema
governsID: 1.3.6.1.4.1.24552.500.1.1.2.0
cn: ldapPublicKey
name: ldapPublicKey
description: MANDATORY: OpenSSH LPK objectclass
lDAPDisplayName: ldapPublicKey
subClassOf: top
objectClassCategory: 3
defaultObjectCategory: CN=ldapPublicKey,CN=Schema,CN=Configuration,DC=ad,DC=local
mayContain: sshPublicKey
dn: CN=User,CN=Schema,CN=Configuration,DC=ad,DC=local
changetype: modify
add: auxiliaryClass
auxiliaryClass: ldapPublicKey
-
作成したスキーマをアップロードします。これも反映に30分ほどかかります。
これでssh鍵認証に対応したADサーバの準備が完了しました。
AD上にユーザーを作成
ADと同一VPC内にユーザー作成用のWindowsServerを起動して、ログインします。
AD関連のツールをインストールします。
AD構築時に作成したAdminユーザー(Admin@ad.local)のログイン情報を入力します。
ADへのログインに成功するとポップアップが表示されますので、一度OSの再起動をします。
ログイン後「ActiveDirectory ユーザーとコンピューター」を開きます。ADのツリーが表示されるので、 ad.local -> ad -> Users
を開き、ユーザーを追加します。
パスワードを入力します。次回ログイン時のパスワードは無効にしておきます。
user01@ad.local
というユーザーの作成に成功しました。
作成したユーザーの属性エディタタブから、sshPublicKeyを探して、編集をクリックします。
これで公開鍵が登録されたユーザーの作成が完了です。
Linux側のAD連携
AmazonLinux2をADに接続できるVPCに起動します。(同一VPCやVPCPeeringなど)
ADの連携をします。
# DNSの書き換えを停止
sed -i 's/PEERDNS=yes/PEERDNS=no/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# DNSをADサーバに変更
vi /etc/resolv.conf
----
nameserver 172.31.22.192
nameserver 172.31.47.137
----
# AD連携に必要なパッケージをインストールします。
yum update
yum -y install samba-common openldap-clients krb5-wokstation adcli sssd realmd samba-common openldap-clients adcli samba-client samba-winbind ldb-tools
# ADにログインします。
realm join -U Admin@ad.local ad.local --verbose
-----
* Resolving: _ldap._tcp.ad.local
* Performing LDAP DSE lookup on: 172.31.47.137
* Performing LDAP DSE lookup on: 172.31.22.192
* Successfully discovered: ad.local
Password for Admin@ad.local:
* Required files: /usr/sbin/oddjobd, /usr/libexec/oddjob/mkhomedir, /usr/sbin/sssd, /usr/bin/net
* Joining using a truncated netbios name: IP-172-31-20-17
* LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.JZ5OB0 -U Admin@ad.local ads join ad.local
Enter Admin@ad.local's password:DNS update failed: NT_STATUS_INVALID_PARAMETER
Using short domain name -- ad
Joined 'IP-172-31-20-17' to dns domain 'ad.local'
No DNS domain configured for ip-172-31-20-17. Unable to perform DNS Update.
* LANG=C LOGNAME=root /usr/bin/net -s /var/cache/realmd/realmd-smb-conf.JZ5OB0 -U Admin@ad.local ads keytab create
Enter Admin@ad.local's password:
* /usr/bin/systemctl enable sssd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sssd.service to /usr/lib/systemd/system/sssd.service.
* /usr/bin/systemctl restart sssd.service
* /usr/bin/sh -c /usr/sbin/authconfig --update --enablesssd --enablesssdauth --enablemkhomedir --nostart && /usr/bin/systemctl enable oddjobd.service && /usr/bin/systemctl start oddjobd.service
* Successfully enrolled machine in realm
----
# sssdの設定(ファイル置き換え)
vi /etc/sssd/sssd.conf
---
[sssd]
domains = ad.local
config_file_version = 2
services = nss, pam, ssh, sudo
[nss]
filter_users = root,named,avahi,haldaemon,dbus,radiusd,news,nscd,centos,ubuntu
[pam]
[ssh]
[sudo]
[domain/ad.local]
ad_domain = ad.local
krb5_realm = AD.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_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = ad
ldap_user_ssh_public_key = sshPublicKey
ad_enable_gc = false
----
# sshdの設定(一部書き換え)
vi /etc/ssh/sshd_config
----
#sshはパスワードログイン無効にします。
PasswordAuthentication no
# 公開鍵をADから取得する設定。既存の設定はコメントアウト。
# AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
# AuthorizedKeysCommandUser ec2-instance-connect
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser root
----
# ADでログインしたユーザーもsudoできるように設定(必要であれば)
visudo
----
#"%domain users@ad.local" ALL=(ALL) NOPASSWD:ALL
"%domain users@ad.local" ALL=(ALL) ALL
----
# 動作確認用にFTPサーバをインストール(FTPはパスワード認証)
yum install vsftpd
systemctl enable vsftpd
# 一度OS再起動します(サービス毎の再起動でも多分OK)
reboot
接続確認
SSH
user01@ad.local
ユーザーでsshしてみます。ADに登録した公開鍵に対応する秘密鍵を指定します。
sudoもできました。
ssh -i AD-TEST.pem.txt user01@ad.local@13.115.75.104
Last login: Tue Nov 19 05:23:38 2019
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[user01@ad.local@ip-172-31-20-172 ~]$ sudo su -
あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:
#1) 他人のプライバシーを尊重すること。
#2) タイプする前に考えること。
#3) 大いなる力には大いなる責任が伴うこと。
パスワード:
最終ログイン: 2019/11/19 (火) 06:13:55 UTC日時 pts/0
[root@ip-172-31-20-172 ~]#
FTP
user01@ad.local
ユーザーとパスワードでログインができます。
注意点
sssdはキャッシュが結構効くので間違えて登録した場合などは一度キャッシュを消すとうまくいく場合ありです。