Linuxのユーザー管理をActive Directoryでやってみる


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を立てていきます。

ADのタイプはAWS Mabager Microsoft ADを選択します。

エディションは規模に応じて選択してください。
今回はディレクトリのDNS名はad.localとします。
Adminパスワードは任意のものを入れてください。

ADを立てたいVPCとサブネットを選択します。冗長構成となるためサブネットが2つ以上あるVPCが必要です。

設定した内容を確認してディレクトリの作成をクリックします。

構築が完了するまで待ちます。(30分ほどかかりました)

ADがアクティブになったら拡張スキーマを登録します。作成したディレクトリIDをクリックします。

メンテナンスタブのスキーマ拡張のアクションからスキーマをアップロードします。

アップロードするスキーマは以下です。

ssh_local.ldif
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サーバの詳細画面からIPアドレスを確認しておきます。

AD上にユーザーを作成

ADと同一VPC内にユーザー作成用のWindowsServerを起動して、ログインします。
AD関連のツールをインストールします。

DNSをADサーバに変更します。

WindowsServerをADに参加させます。

変更をクリックします。

設定したドメインを入力してOKをクリックします。

AD構築時に作成したAdminユーザー([email protected])のログイン情報を入力します。

ADへのログインに成功するとポップアップが表示されますので、一度OSの再起動をします。

ADユーザーでRDPでログインを行います。

ログイン後「ActiveDirectory ユーザーとコンピューター」を開きます。ADのツリーが表示されるので、 ad.local -> ad -> Usersを開き、ユーザーを追加します。

ここではuser01というユーザーを作成します。

パスワードを入力します。次回ログイン時のパスワードは無効にしておきます。

[email protected] というユーザーの作成に成功しました。

公開鍵を入力するための拡張スキーマの表示を有効にします。

作成したユーザーの属性エディタタブから、sshPublicKeyを探して、編集をクリックします。

利用する公開鍵を入力して、追加をクリックします。

OKを押して保存します。

これで公開鍵が登録されたユーザーの作成が完了です。

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 [email protected] 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 [email protected]:
 * 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 [email protected] ads join ad.local
Enter [email protected]'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 [email protected] ads keytab create
Enter [email protected]'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 [email protected]" ALL=(ALL) NOPASSWD:ALL
"%domain [email protected]" ALL=(ALL) ALL
----

# 動作確認用にFTPサーバをインストール(FTPはパスワード認証)
yum install  vsftpd
systemctl enable vsftpd

# 一度OS再起動します(サービス毎の再起動でも多分OK)
reboot

接続確認

SSH

[email protected] ユーザーでsshしてみます。ADに登録した公開鍵に対応する秘密鍵を指定します。
sudoもできました。

ssh -i AD-TEST.pem.txt [email protected]@13.115.75.104
Last login: Tue Nov 19 05:23:38 2019

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[[email protected]@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

[email protected] ユーザーとパスワードでログインができます。

注意点

sssdはキャッシュが結構効くので間違えて登録した場合などは一度キャッシュを消すとうまくいく場合ありです。

参考
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/sssd-cache