今回はAmazon Linux2(CentOS7含む)のローカルアカウント管理に限界を感じたため、WindowsADに参加して、ADアカウントでLinuxサーバにログイン出来るようにした時の内容になります。
本記事ではsssdやrealmを使います(winbindより新しい仕組みでより簡単に導入可能です)。
★ただし、linuxディレクトリのsamba(cifs)経由でアクセスしたい場合はsssd&realmでは出来ない?(難しい?)ようです。samba(cifs)も考慮したい場合は素直にwinbindを使う手順でいきましょう。
手順
部分的にAWS公式サイトの以下記事を参考にしながら進めます。
パッケージの導入
sudo yum -y update
sudo yum -y install sssd realmd krb5-workstation samba-common-tools
ドメイン参加
ドメイン参加時のホスト名(コンピュータ名)は「–conputer-name」で明示的に指定可能です。もしも省略した場合は「/etc/hostname」の設定に従うため事前に確認しておきましょう。
書式:realm join [-U user] [realm-name]
sudo realm join -U XXX@YYY.jp YYY.jp --verbose --computer-name "ZZZ"
→ コマンド実行後にユーザXXXのパスワードを聞かれるため入力します。
ホスト名は15文字以内にしましょう。超えた場合、ADサーバ上ではホスト名が15文字までで登録されます(NETBIOS制約)。
設定変更:表記変更
デフォルトの場合、ログイン時に「ドメイン名\ユーザ名」という表記で指定する必要があります。また、ドメインユーザでログインした後、ホームディレクトリは「ドメイン名が含まれた表記」となります。
→ ドメイン名を含まない表記にしたほうが色々と扱いやすいため、設定ファイル「/etc/sssd/sssd.conf」を次のように変更します。
sudo vi /etc/sssd/sssd.conf
・use_fully_qualified_namesを「True」→「False」にする。
・fallback_homedirを「/home/%u@%d」→「/home/%u」にする。
設定変更:アクセス権
続いて、デフォルトはドメインユーザ(DomainUsers)にアクセス権限が許可されています。全員アクセス可能なポリシーであれば良いのですが、ADの一部グループに絞りたい場合もあると思います。
sssd.confを変更を加えても良いのですが「ad_access_filter = (memberOf=cn=admins,ou=Testou,dc=example,dc=com)」等といった表記が少し面倒なのと、複数指定出来るのかわかりません(未調査)。
であれば、realmやsssd_configを使ってアクセス制御したほうが、表記上はわかりやすいのかなって個人的には思います。
sshだけ制限をかけたい場合は、/etc/ssh/sssd_configの「AllowGroups」構文でユーザやグループを指定すればOKですが、ローカルアカウントも一緒に制限がかかるため注意が必要です。
今回は詳細を割愛しますが、pamのaccess.confファイルでローカル/ADのグループをまとめて制御するでも良いと思います(認証対象がsshだけでなくsamba、xrdp等が増えても一括管理できる)。
設定確認・反映
# 設定確認
sudo realm list
sudo cat /etc/sssd/sssd.conf
# 設定反映(サービス再起動)
sudo systemctl restart sssd
余談ですが、ドメイン参加時にホスト名を指定している場合(–computer-name)、sssd.confの「ldap_sasl_authid」行に表現されます。
一方でホスト名を未指定の場合はldap_sasl_authidの項目がありません。/etc/hostnameが固定なら良いですが、環境コピーした場合は現状が何のホスト名として参加しているのか判断出来ないかもしれません。
以上でドメインアカウントでssh接続可能になります。なお、パスワード入力完了してからプロンプト表示までに10秒程度待たされることが良くあります。将来改善されることを期待します。
補足・参考事項
(補足) nsswitchやkrbの設定は?
不要です(既に設定されている)
/etc/nsswitch.conf(アカウント等の検索順序の定義)を見る限り以下(一部抜粋)のようになっており、各種情報の検索先として「sss」が既に設定されており、改めて設定は不要です。
passwd: files sss
shadow: files sss
group: files sss
:
/etc/krb5.conf(Kerberos認証設定)を見る限り、既にドメイン名が設定されています。オプションは基本的にデフォルトで問題ないと考えます。
sssd+realmを利用すると、この辺り自動的なんですね(実際にはrealmパッケージが頑張ってくれている)。便利だけど全体的な構造や仕組みは知っておかないと障害時に困るかもしれません。
(参考) ドメイン離脱
ドメイン参加後に離脱する場合は次の通りです。
realm leave
ただし、本コマンドではADサーバ上にホスト名が残ったままになります。残ったところで大きな問題は生じないと思いますが、ADサーバ上からホスト名を消したい場合は、ADサーバの管理者レベルのユーザアカウントで次のように実行します。
realm leave -r -U アカウント名
※管理者レベルのアカウント指定じゃなくてもADサーバから消えることはあります(参加時のアカウント権限にも依存している可能性有)。
(参考) man realm 抜粋
NAME
realm - Manage enrollment in realms
SYNOPSIS
realm discover [realm-name]
realm join [-U user] [realm-name]
realm leave [-U user] [realm-name]
realm list
realm permit [-ax] [-R realm] {user@domain...}
realm deny -a [-R realm]
Ubuntu 20.04の場合
Ubuntu 20.04でも設定する機会があったため差異を中心に残しておきます。
■パッケージインストール
sudo apt install sssd realmd
sudo apt install sssd-tools
sudo apt install adcli
sudo apt install oddjob-mkhomedir
■ドメイン参加
sudo realm join -U XXX@YYY.jp YYY.jp –verbose –computer-name “ZZZ”
のようにユーザID「XXX」の後に「@YYY.jp」があると何故か参加が失敗してしまった。省略すると参加成功した。一般ユーザでも参加可能なのは変わらず。
■sssd.confの設定変更
Ubuntuの場合、ドメインユーザのsshログイン時に弾かれてしまう問題に遭遇。
pam_sss(sshd:account): Access denied for user xxxx: 4 (System error)
Failed password for adminendo from 192.168.1.2 port 65391 ssh2
fatal: Access denied for user xxxx by PAM account configuration [preauth]
あまり納得はしてないけどsssd.confのドメインセクションに以下追記することで解消した。
ad_gpo_access_control=permissive
(デフォルトってpermissiveじゃないのかな・・・。そもそも意味合いが違う?)
■ログイン時にホームディレクトリを作成
/etc/pam.d/common-sessionに以下を追記しましょう。
session optional pam_mkhomedir.so skel=/etc/skel umask=077
ここでパッケージ「oddjob-mkhomedir」が役に立つといったところでしょうか。Amazon Linux2だと特に指定はしなかったと記憶しているけどubuntu20.04では明示的に指定(config系スクリプトによる方法もあったはず)。
まとめ
Linuxでsssd+realmを利用してドメイン参加を行う方法及び、アクセス制限を行う方法についてご紹介しました。私の場合、Amazon Linux2を使いましたが、Centos7やRedhat7でも同等の手順で問題ないと思います。「sssd+realm」を利用した場合、手作業による設定が少なく、比較的簡単にドメインユーザでLinuxにログイン可能になるためお勧めです。
本記事が誰かのお役に立てば幸いです。
最後までご覧いただき、ありがとうございました。
コメント