«前の日記(2014-09-08 (Mon)) 最新 次の日記(2014-09-12 (Fri))» 編集

雑記帳


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より、アドバイスをもらった。

まさにその通りで、インスタンスを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

これで問題ないようだ。