雑記帳
2014-09-09 (Tue) [長年日記]
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (2)
2014-09-29追記: RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (5)にて、samba-clientの代わりに、realmdを使ってドメインに参加する方法を追記。realmdを使ったほうが楽なのでオススメ。
前回示した構成での構築を進めていく。対象となる環境はAWSで、VPCを用意して、そこにActive Directory Domain Serviceを構成する。
ちなみに、VPC上にActive Directoryを構築する方法については、Active Directory on AWSが大変参考になる。
構築したADの情報
今回は、下記のような構成でADを用意した。
- ドメイン名は、example.localとする。NetBIOS名はEXAMPLEとなる。
- 複数AZにそれぞれ一台ずつADサーバを用意する。
- ad1.example.local (10.0.2.4)
- ad2.example.local (10.0.130.4)
- DHCP Option Setで、VPC内の名前解決をADサーバでできるように設定しておく。
netbios-node-type = 2 ntp-servers = 10.0.2.4, 10.0.130.4 domain-name = exmaple.local domain-name-servers = 10.0.2.4, 10.0.130.4 netbios-name-servers = 10.0.2.4, 10.0.130.4
以上のような環境に、Red Hat Enterprise Linux 7(RHEL7)を追加して、ユーザ認証をADでできるようにする。
基本設定
認証まわりの設定をする前の、前提となるいくつかの基本的な設定を行う。
ホスト名の設定
RHEL7でホスト名を変更するの手順に従って、ホスト名を適切なものに変更する。
# hostnamectl set-hostname linux1 --static # vim /etc/cloud/cloud.cfg preserve_hostname: true # 追記
時計を調整する
タイムゾーンをJSTに変更したり、ADサーバと同期させたりする。NTPについては、ADやVPCの設定が適切に設定されていれば、特に追加の設定はいらないはず。
各種パッケージのインストール
今回必要となるパッケージは以下のとおり。
- sssd, sssd-ad
- RHEL7には、SSSDのパッケージが用意されているので、それを導入する。sssd-adという、Active Directoryに対応するパッケージがあるので、それも入れる。
- krb5-workstation
- 認証にKerberosを使用するため、Kerberos関連のパッケージを入れる。
- samba-client
- ドメインに参加する際に、netコマンドを使用するので入れる。
- oddjob-mkhomdir
- ドメインユーザがログインした時に、自動的にホームディレクトリを作成してくれるツールも入れる。
ということで、下記のコマンドを実行してインストールする。
# yum -y install sssd sssd-ad krb5-workstation samba-client oddjob-mkhomedir
Kerberosの設定
/etc/krb5.confの、libdefaultsセクションを、下記のように設定する。
[libdefaults] dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false default_realm = EXAMPLE.LOCAL default_ccache_name = KEYRING:persistent:%{uid}
Sambaの設定
ドメインに参加する目的でnetコマンドを使用するため、/etc/samba/smb.confのglobalセクションを下記のように設定する。
[global] workgroup = EXAMPLE client signing = yes client use spnego = yes kerberos method = secrets and keytab security = ads realm = EXAMPLE.LOCAL password server = AD1.EXAMPLE.LOCAL AD2.EXAMPLE.LOCAL
Kerberosの初期化
kinitを実行して、TGTを取得する。指定するアカウントは、ADのドメイン管理者を指定する。
# kinit Administrator Password for Administrator@EXAMPLE.LOCAL:
ドメインに参加
net ads joinを実行して、ドメインに参加する。
# net ads join -U administrator Enter administrator's password: Using short domain name -- EXAMPLE Joined 'LINUX1' to dns domain 'example.local' No DNS domain configured for jump. Unable to perform DNS Update. DNS update failed: NT_STATUS_INVALID_PARAMETER
"Joined 'LINUX1' ... と出力されているので、ドメインに参加できている。その下に出力されているエラーは、DNSの動的更新に失敗したというエラーになる。今回やることに影響がないので、とりあえず放っておく。これについては別途解決する予定。
ここまでで、ADドメインへの参加ができた。ちょっと長くなってきたので今回はここまでとする。待て次号!
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (3)
前回は、ドメインの参加まで実現したので、実際に認証ができるように設定をすすめていく。
SSSDの有効化
authconfigコマンドを使って、SSSDを使うように設定する。また、合わせてmkhomedirも有効化する。
# authconfig --enablesssd --enablesssdauth --enablemkhomedir --update
SSSDの設定
/etc/sssd/sssd.confを、下記のように設定する。
[sssd] config_file_version = 2 domains = example.local services = nss, pam, pac [domain/example.local] id_provider = ad ad_server = ad1.example.local,ad2.example.local ad_hostname = ad1.example.local,ad2.example.local auth_provider = ad chpass_provider = ad access_provider = ad ldap_schema = ad ldap_id_mapping = True cache_credentials = true ldap_access_order = expire ldap_account_expire_policy = ad ldap_force_upper_case_realm = true
sssd.confのパーミッションを下記のように設定する。
# chown root:root /etc/sssd/sssd.conf # chmod 0600 /etc/sssd/sssd.conf
パスワード認証でSSHできるように、設定を変更する。
# vim /etc/ssh/sshd_config PasswordAuthentication yes # 変更
ここまで設定した後、sshdと、sssdを再起動する。
# systemctl restart sshd.service # systemctl restart sssd.service
これで、認証する準備は整ったはず。
まずは、ユーザの情報が引けるか確認してみる。テストでaduserという名前のユーザを作って、確認してみる。
$ id aduser uid=1436601105(isobe) gid=1436600513(domain users) groups=1436600513(domain users),1436600512(domain admins),1436600572(denied rodc password replication group)
情報がとれた!
uidはsssdによって自動的にマッピングされている。従来は、UNIX ID管理を使って、UNIXシステム側のuidを手作業でマップしなければならなかったが、sssdが勝手にやってくれている。
それでは、sshでログインしてみよう。
% ssh aduser@xx.yy.zz.100 aduser@xx.yy.zz.100's password: -sh-4.2$ pwd /
Active Directoryで登録したパスワードでログインできた!
ただし、現時点ではホームディレクトリが存在していないため、/にchdirした状態になっている。これについては、すでに導入しているmkhomedirを使って設定できる。それについては次回に続く。待て次号!
■ [Linux][Windows] RHEL7をActive Directory on Windows Server 2012 R2でユーザ認証させる (4)
前回までで、認証はできるようになったが、ログインしたユーザのホームディレクトリが無いという問題があったので、それの対応などを行う。
SSSDの設定を追加
すでに導入済みとなる、oddjob_mkhomedirの設定を、/etc/sssd/sssd.confに追記する。
[domain/example.local] override_homedir = /home/%d/%u [nss] fallback_homedir = /home/%u
%dは、ドメイン名、%uはユーザ名が補間されて、初回ログイン時に自動的にディレクトリが作成されるようになる。
設定を変更したら、sssdを再起動する。
# systemctl restart sssd.service
それでは、再度ログインしてみる。
% ssh aduser@xx.yy.zz.100 aduser@xx.yy.zz.100's password: Creating home directory for aduser. Last login: Tue Sep 9 16:10:25 2014 from xxx.yyy.zzz.241 [aduser@linux1 ~]$ pwd /home/example.local/aduser
想定通り、ホームディレクトリが作成された。
デフォルトのシェルを指定する
ADドメインユーザは、LDAPv3スキーマのloginShell属性でシェルの定義を行う。しかし、AD側で一々設定するのは面倒なので、SSSD側の設定で実現する。
[domain/example.local] default_shell = /bin/bash [nss] shell_fallback = /bin/sh allowed_shells = /bin/bash
ちなみに、/etc/passwdにエントリが無いため、chshを実行してもシェルを変更できない。
[aduser@linux1]~% chsh aduser のシェルを変更します。 新しいシェル [/bin/zsh]: /bin/bash パスワード: chsh: user "aduser" does not exist.
とりあえず、ユーザがADで認証してSSHログインできるところまでできた。
■ [Linux] bashの実行結果をsyslogに出力する(RHEL7)
HistoryをSyslogに出力BashのRPMを作ってみた(CentOS6)を参考に、RHEL7でも実践した。
必要なパッケージのインストール
# yum -y install rpm-build texinfo bison ncurses-devel autoconf gettext gcc make yum-utils
bashのsrc.rpmのダウンロード
# yumdownloader --source bash Loaded plugins: amazon-id, rhui-lb Enabling rhui-REGION-rhel-server-releases-source repository rhui-REGION-rhel-server-releases-source | 2.9 kB 00:00:00 rhui-REGION-rhel-server-releases-source/7Server/x86_64/primary_db | 665 kB 00:00:00 rhui-REGION-rhel-server-releases-source/7Server/x86_64/updateinfo | 74 kB 00:00:00 bash-4.2.45-5.el7.src.rpm | 6.8 MB 00:00:00
src.rpmの展開
# rpm -Uvh bash-4.2.45-5.el7.src.rpm
bash.specの編集
# cd rpmbuild/SPECS/ # vim bash.spec # makeのCPPFLAGSに、-DSYSLOG_HISTORYを追加 make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' -DSYSLOG_HISTORY `getconf LFS_CFLAGS`"
rpmのビルド
# rpmbuild -ba bash.spec
できた。
# cd ../RPMS/x86_64/ # ls -l total 3708 -rw-r--r--. 1 root root 1030568 Sep 9 19:42 bash-4.2.45-5.el7.x86_64.rpm -rw-r--r--. 1 root root 1509088 Sep 9 19:42 bash-debuginfo-4.2.45-5.el7.x86_64.rpm -rw-r--r--. 1 root root 1253056 Sep 9 19:42 bash-doc-4.2.45-5.el7.x86_64.rpm
rpmのインストール
# rpm -Uvh bash-4.2.45-5.el7.x86_64.rpm --force
ログに出力されるかのテスト
ADドメインのユーザでログインしなおして、適当にコマンドを実行してみる。
Sep 9 19:44:47 linux1 -bash: HISTORY: PID=28661 UID=1436601105 cat /var/log/messages Sep 9 19:44:50 linux1 -bash: HISTORY: PID=28661 UID=1436601105 exit
このbashのみインストールしたシステムでは、ユーザはシェルを変更することが出来ないので、全ての実行したコマンドがロギングされるということになる。
UIDについて
ちなみに、自動的にマッピングされるUIDは、ADユーザのsidからハッシュ化されて生成されるようだ。AD側のSIDが同じであれば、Linux側のUIDも同じになることが期待できるので、複数サーバに展開しても、UIDは同一のものが利用される。
■ [AWS][Windows] EC2のWindows Server 2008以降はインスタンスの再起動を行うとタイムゾーンがUTCにリセットされる、その対処法
一連のActive Directoryの構築と検証を行なっている時に、あるタイミングから"Preauthentication failed"というエラーがでて、ADドメインユーザでログインができなくなってしまった。色々と調べていたら、ADサーバのタイムゾーンが、JSTからUTCに戻ってしまっていることが分かり、JSTに再設定したところ、問題が解消された。
なぜタイムゾーンがUTCに戻ったんだろうと疑問に思ってつぶやいたら、mayukiより、アドバイスをもらった。
@muramasa64 AWSでインスタンス再起動とかしてません? http://t.co/skwxYOcjag
— Mayuki Sawatari (@mayuki) 2014, 9月 9
まさにその通りで、インスタンスをstop & startを実施したりしていた。このドキュメントによると、この動作を抑止することができるようなので、設定を行う。
コマンドプロンプトを開き、下記のコマンドを実行すれば良い。
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
結果を確認したければ、下記のコマンドを実行して出力を確認する。RealTimeIsUniversalの値が、REG_DWORDで1になっている。
reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /s HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation DaylightBias REG_DWORD 0x0 DaylightName REG_SZ @tzres.dll,-631 StandardStart REG_BINARY 00000000000000000000000000000000 StandardBias REG_DWORD 0x0 StandardName REG_SZ @tzres.dll,-632 Bias REG_DWORD 0xfffffde4 DaylightStart REG_BINARY 00000000000000000000000000000000 TimeZoneKeyName REG_SZ Tokyo Standard Time DynamicDaylightTimeDisabled REG_DWORD 0x0 ActiveTimeBias REG_DWORD 0x0 RealTimeIsUniversal REG_DWORD 0x1
これで問題ないようだ。