3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Linux)ログイン時にActiveDirectoryのユーザ名・パスワードで認証できるようにする

今回したいのはLinux使用時にも、LinuxのログオンではActiveDirectoryに登録したユーザ名・パスワード(ドメインユーザ)情報を使いたいということです。

LinuxとActiveDirectoryの認証統合にはパスワードだけの統合とユーザ名も含めた統合とがあります。

前者の場合はLinuxマシン上にActiveDirecotory上に存在するのと同じユーザ名のユーザを作成し、パスワードだけActiveDirectoryのドメインコントローラに問い合わせるというものです。

後者はLinuxマシン上にユーザ情報を持たず、全てActiveDirectoryに問い合わせるというものです。

当然前者はそのLinuxPCを使うと想定されるユーザを前もって登録しないといけないのでメンテナンス性に優れません。

ということで、今回は後者の方法を試してみました。

試したLinuxUbuntu 10.04 ベースの軽量ディストリビューション EcoLinux 10.04 です。

Linuxドメインとの連携はいろいろな方法があるんですが、Windowsサーバ側では特に何も設定しなくてよい Samba + Winbind の方式としました。

その他の方式については、Active DirectoryとLinuxの認証を統合しよう:第0回 認証統合の概要とSamba|gihyo.jp の2ページ目にまとめられています。

実際の手順はActive DirectoryとLinuxの認証を統合しよう:第5回 SambaのWinbind機構による認証統合[1]|gihyo.jpをベースにやってみました。

(Linux)ActiveDirectory連携したSambaサーバでWinクライアントからSamba共有フォルダにシングルサインオンの設定とほぼかぶっています。異なるのは、telnetSSHでもADユーザでログインできるようにするために、この記事ではPAM認証を行っているというところだけです。

1.

EcoLinuxは軽量なので、多くのパッケージが入っていません。それで、まずは下記コマンドで samba と winbind ,ケルベロス認証パッケージをインストールします。

# sudo apt-get install samba

# apt-get install winbind

# apt-get install krb5-user

↑(インストール時になんか聞いてきますが何も入れずに 了解 としておきます。)

# apt-get install sysv-rc-conf

2.

次に、ネットワークの設定で、Windowsドメイン名と、DNSサーバのIPアドレスを指定しないといけません。

/etc/resolv.confを下記のように修正します。

# vi /etc/resolv.conf

search hogedomain.local ←Windowsドメイン名の指定

nameserver 192.168.0.10 ←DNSサーバ(ドメインコントローラ)のIP

3.

また,自身のホスト名の名前解決ができない場合は,ドメイン参加の際にDNSの動的更新に失敗するようです。これ自体は致命的な問題ではありませんが,可能な限りDNSもしくは/etc/hostsファイルで名前解決の設定を行っておくことがいいようです。

# vi /etc/hosts

192.168.0.123 sambasv.hogedomain.jp sambasv

4.

ここから、Sambaの設定をするわけですが、既にSambaが動いてる場合は止めた方がいいでしょう。また設定ファイルのバックアップを取るのも常です。

# /etc/init.d/smbd stop

# cp /etc/samba/smb.conf /etc/samba/smb.conf.bk

smb.confを下記のように設定します。

vi /etc/samba/smb.conf

...

workgroup = hogedomain ←ドメインのNetBIOS名指定

...

security = ads ←userになってるのを修正

passdb backend = tdbsam

realm = HOGEDOMAIN.LOCAL ←ADのFQDNを大文字で

password server = dc01 ←ドメインコントローラのホスト名

idmap uid = 10000-20000 ←コメントアウト除去。ADに登録されているユーザ数より多い範囲を指定。ドメインユーザはこの範囲でuidが振られる

idmap gid = 10000-20000 ←コメントアウト除去。ADに登録されているユーザ数より多い範囲を指定

winbind use default domain = yes ←Noにした場合は "ドメイン名(大文字)\ユーザー名" でログインすることが必要

template shell = /bin/bash

template homedir = /home/%U

↑ ユーザのホームディレクトリをどこにするか。

指定しない場合のデフォルトだと /home/ドメイン名/ユーザ名 となる

よって /home/ドメイン名 のフォルダを作成し、1777のアクセス権にしないといけない。

[tmp] ←動作確認用の共有

path = /tmp

writeable = yes

5.

smb.confの template homedir で指定したパス(指定しない場合は /home/ドメイン名)に権限を付与します。

# mkdir /home/HOGEDOMAIN

# chmod 1777 /home/HOGEDOMAIN/

6.

(まだホスト名の変更をしてない場合はその前に /etc/hostname で任意のホスト名を変更し、再起動しておいた方がいいです。)

LinuxPCをActiveDirectoryに参加させます。

root@ecolinux:~# net ads join -U Administrator

Enter Administrator's password:

Using short domain name -- HOGEDOMAIN

Joined 'ECOLINUX' to realm 'hogedomain.local'

[2010/11/30 11:10:24, 0] libads/kerberos.c:333(ads_kinit_password)

kerberos_kinit_password ECOLINUX$@HOGEDOMAIN.LOCAL failed: Client not found in Kerberos database

No DNS domain configured for ecolinux. Unable to perform DNS Update.

DNS update failed!

上記のように「Joined...」から始まる行が出力されたら,ドメインへの参加は成功です。

SambaのDNSの動的更新機能が有効になっているため,自身のFQDNが名前解決できないと,上記のように「成功」メッセージに引き続き,「DNS update failed!」というエラーが出力されます。

また、ドメインコントローラとの時間が大きくズレていると失敗します。

ActiveDirectoryに参加が完了すると、ActiveDirectoryのComputersコンテナにコンピュータアカウントが生成さるので、ドメインコントローラのActive Directoryユーザとコンピュータ に上記で登録したLinuxマシンが存在することを確認します。

7.

参考サイトでは authconfig コマンドを使って設定するように書いてますが、authconfig がEcoLinuxには無いので手動で設定します。

#vi /etc/krb5.conf

[libdefaults]

default_realm = HOGEDOMAIN.LOCAL

[realms]

HOGEDOMAIN.LOCAL = {

kdc = dc01.hogedomain.local ←ドメインコントローラ指定。

kdc = dc02.hogedomain.local ←ドメインコントローラ指定。(2台目)

kdc = 192.168.0.10 ←ドメインコントローラのIP

admin_server = dc01.hogedomain.local ←ドメインコントローラ指定。

default_domain = hogedomain.local ←ドメイン名(FQDN)指定。

}

[domain_realm]

.hogedomain.local = HOGEDOMAIN.LOCAL

hogedomain.local = HOGEDOMAIN.LOCAL

/etc/nsswitch.confも修正します。

# vi /etc/nsswitch.conf

passwd: compat winbind ←winbind追加

group: compat winbind ←winbind追加

hosts: files dns wins ←wins追加

8.

ここからpamの設定を行います。

pamというのがよくわかっていませんが、各種の認証を行うためのモジュールのようです。ここで設定することで、ssh,telnet,ftp等のPAM認証に対応したソフトでもドメインユーザで認証できるようになります。

# vi /etc/pam.d/common-account

既存で記述してある部分を全て「#」でコメントアウトし、以下を記述

account sufficient pam_winbind.so

account required pam_unix.so

# vi /etc/pam.d/common-auth

既存で記述してある部分を全て「#」でコメントアウトし、以下を記述

auth sufficient pam_winbind.so

auth required pam_unix.so nullok_secure use_first_pass

# vi /etc/pam.d/common-password

下記を適当な場所に追記

password required pam_unix.so nullok obscure min=4 max=50 md5

# vi /etc/pam.d/common-session

下記を適当な場所に追記

session required pam_mkhomedir.so umask=0022

各ファイルを保存して終了

後は,winbind,sambaを自動起動するようにします。

RedHat,Fedora系ならchkconfigでできるんですが、Debain,Ubuntu系は sysv-rc-conf というツールを入れてやる必要あるようです。

使い方は chkconfig とほぼ同じようです。

sysv-rc-confで winbind , smb を自動起動するようにします。(パッケージでインストールした場合、もしかしたらこれしなくてもよかったかもしれません。)

# sysv-rc-conf winbind on

# sysv-rc-conf smbd on

9.

後は動作確認を行います。

sambaとwinbindを起動させます。

# /etc/init.d/smbd start

# /etc/init.d/winbind start

# wbinfo -t

checking the trust secret via RPC calls succeeded

↑"succeeded" と出ていれば成功です。

# wbinfo -u ←アカウントの一覧を列挙する

HOGEDOMAIN\administrator

HOGEDOMAIN\guest

......

# id 'HOGEDOMAIN\usera' ←指定したアカウントのuidとgidを参照

uid=10000(HOGEDOMAIN\usera) gid=10022(HOGEDOMAIN\domain users)

# getent passwd 'HOGEDOMAIN\usera' ←指定したアカウントのpasswd情報を参照

HOGEDOMAIN\usera:*:10000:10022:sannryuu pg:/home/HOGEDOMAIN/usera:/bin/false

ADの情報がちゃんととれていればOKです。

ちゃんと設定できていれば、ドメインに参加しているWindowsクライアントから、このLinuxの samba でテストのために作った tmp 共有フォルダにアクセスできるはずです。

後は、実際に EcoLinux を再起動してログイン画面でドメインユーザを指定するだけっ と思っていたらログインできません。

これには EcoLinux (多分ubuntuも)特有の罠が。。。。

詳しくは次回説明します。

参考:

Active DirectoryとLinuxの認証を統合しよう:第5回 SambaのWinbind機構による認証統合[1]|gihyo.jp 今回のメインの参考先。

Active DirectoryとLinuxの認証を統合しよう:最終回 SambaのWinbind機構による認証統合[2]|gihyo.jp 今回のメインの参考先。

winbind で Linux 認証 on Ubuntu - daily dayflower: 上記参考先はRedhatベースですがここはUbuntuベースです。

SambaとWinbindでActive Directoryに参加|元研究員の日記: こちらの情報も助かりました。

Ubuntuではchkconfigではなくsysv-rc-confを使って不要なサービスを停止させる sysv-rc-confに関する話。