LDAPサーバとSambaサーバを構築
環境
- OpenStack のインスタンス上
- OS: CentOS Linux release 7.2.1511 (Core)
- LDAPサーバ: OpenLDAP
ほんとにやりたかったこと
あるインスタンス上に LDAP サーバを構築、ユーザ管理。別のインスタンス上の Samba サーバにその情報を用いてログインを行えるようにする(したかった)。
今回は…
動作を把握するため、感覚を養うために同一インスタンス上に LDAP サーバと Samba サーバを構築。(ようは試したがうまくいかなかったのだ。)
LDAP サーバのデータでネットワーク上から Samba サーバにログインして利用できるようにする。
OpenLDAP のインストール
yum コマンドでインストール可能。コマンドラインツールが必要になるので、クライアントパッケージもインストールする。
<br /> $ sudo yum -y install openldap openldap-clients openldap-servers<br />
次がインストールされた:
- openldap-clients.x86_64 0:2.4.40-9.el7_2
- openldap-servers.x86_64 0:2.4.40-9.el7_2
Berkeley DBのDB設定ファイルをサンプルからコピーします。
<br /> $ sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG<br />
サーバ起動時にslapdサービスを自動起動するように設定し、起動する。
<br /> $ sudo systemctl enable slapd<br /> $ sudo systemctl start slapd<br />
firewalld の設定(ldap)
OpenStack上では不要なため省略。
実サーバであれば注意。
設定
下準備
編集用のファイルを保存するディレクトリを作成し、移動。
<br /> $ mkdir ~/ldap_work<br /> $ cd ~/ldap_work/<br />
パスワードのハッシュを生成。
<br />
$ slappasswd<br />
New password:<br />
Re-enter new password:<br />
{SSHA}KjuXS0F2kb/HCdfjEOmeJw2aNoZUneAY<br />
パスワードに設定したい文字列を「New password」「Re-enter new password」のそれぞれに入力する。
生成された文字列(今回の例では「{SSHA}KjuXS0F2kb/HCdfjEOmeJw2aNoZUneAY」)を使う(のでコピーなどしておく)。
サーバ管理者 (Root DN) のパスワードの設定
ファイル add_rootPw.ldif を次の内容で作る。
<br />
dn: olcDatabase={0}config,cn=config<br />
changetype: modify<br />
add: olcRootPW<br />
olcRootPW: **パスワード**<br />
**パスワード** の部分は slappasswd で生成したパスワードのハッシュを記述する、以下同様。
ldapadd コマンドで add_rootPw.ldif の内容を登録する。
<br /> $ ldapadd -Y EXTERNAL -H ldapi:// -f ~/ldap_work/add_rootPw.ldif<br />
-Y EXTERNALとつけることでローカル環境からパスワード無しでコマンドを実行できる。
LDAPベースエントリの変更
ファイル change-domain.ldif を次の内容で作る。
<br />
dn: olcDatabase={1}monitor,cn=config<br />
changetype: modify<br />
replace: olcAccess<br />
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"<br />
read by dn.base="cn=Manager,dc=test,dc=yk,dc=local" read by * none</p>
<p>dn: olcDatabase={2}hdb,cn=config<br />
changetype: modify<br />
replace: olcSuffix<br />
olcSuffix: dc=test,dc=yk,dc=local</p>
<p>dn: olcDatabase={2}hdb,cn=config<br />
changetype: modify<br />
replace: olcRootDN<br />
olcRootDN: cn=Manager,dc=test,dc=yk,dc=local</p>
<p>dn: olcDatabase={2}hdb,cn=config<br />
changetype: modify<br />
add: olcRootPW<br />
olcRootPW: **パスワード**<br />
ldapmodify コマンドで change-domain.ldif の内容を登録する。
<br /> $ ldapmodify -x -D cn=config -W -f change-domain.ldif<br />
コマンドを実行すると、パスワードを聞かれるので、先ほど設定したパスワードを入力する。
LDAPベースエントリの登録
ファイル base.ldif を次の内容で作る。
<br /> dn: dc=test,dc=yk,dc=local<br /> objectClass: dcObject<br /> objectClass: organization<br /> dc: test<br /> o: test.</p> <p>dn: ou=People,dc=test,dc=yk,dc=local<br /> objectClass: organizationalUnit<br /> ou: People</p> <p>dn: ou=Group,dc=test,dc=yk,dc=local<br /> objectClass: organizationalUnit<br /> ou: Group<br />
ldapadd コマンドで base.ldif の内容を登録する。
<br /> $ ldapadd -x -D "cn=Manager,dc=test,dc=yk,dc=local" -W -f base.ldif<br />
コマンドを実行すると、パスワードを聞かれるので、先ほど設定したパスワードを入力する。
config と Manager でパスワードを変えた時は注意。
ログファイルの参照
CentOS 7.0 からは journal コマンドでログを参照する。
<br /> sudo journalctl -u slapd -f<br />
デフォルトのログレベルは stats(256) 。
ログレベル変更
今回のセットアップでは使用しなかったが、今後のためのメモ。
短いldifなので標準入力から直接投入。
ログレベルを 0 に変更して一切ログを出力されなくする例。
<br /> $ ldapmodify -x -D cn=config -W <<EOF<br /> dn: cn=config<br /> changetype: modify<br /> add: olcLogLevel<br /> olcLogLevel: 0<br /> EOF<br />
2 回目以降は replace なので以下のようにする。
<br /> $ ldapmodify -x -D cn=config -W <<EOF<br /> dn: cn=config<br /> changetype: modify<br /> replace: olcLogLevel<br /> olcLogLevel: 0<br /> EOF<br />
スキーマの追加
LDAPは、スキーマに合致したデータのみが登録できる。
各種データを登録する前に、それぞれに適したスキーマを有効にする必要がある。
まずは現在追加されているスキーマを確認。
<br /> $ ldapsearch -x -LLL -W -D cn=config -b cn=config "(objectClass=olcSchemaConfig)" dn<br />
その後、以下のコマンドでスキーマを追加。
<br /> $ ldapadd -x -W -D cn=config -f /etc/openldap/schema/cosine.ldif<br /> $ ldapadd -x -W -D cn=config -f /etc/openldap/schema/inetorgperson.ldif<br />
Samba のインストール
yum コマンドを用いて、必要なパッケージをインストールする。
<br /> sudo yum install -y samba samba-client samba-common<br />
sambaの自動起動を有効にして、起動する。
<br /> $ sudo systemctl enable smb.service<br /> $ sudo systemctl enable nmb.service<br /> $ sudo systemctl start smb.service<br /> $ sudo systemctl start nmb.service<br />
firewalld の設定(smb)
OpenStack上では不要なため省略。
実サーバであれば注意。
設定
まずは、Samba自体がちゃんと動くことを確認する意味も込めて、ログイン不要で見ることができるディレクトリを作る。
設定ファイル /etc/samba/smb.conf を編集する。
<br /> $ cd /etc/samba<br /> $ sudo cp smb.conf smb.conf.bk1 # 念のためバックアップ<br /> $ vi /etc/samba/smb.conf<br />
<br />
passdb backend = tdbsam<br />
# 以下の行を追加<br />
map to guest = Bad User<br />
<br /> # ファイルの最後に以下を追加<br /> [Share]<br /> path = /samba/share<br /> browsable = yes<br /> writable = yes<br /> guest ok = yes<br /> read only = no<br />
あくまで例。参考に。
その後、共有に使用するディレクトリを作成し、パーミッション等や SELinux まわりを設定する。
(めんどくさいので SELinux を無効にする人もいるが今回は有効のまま進める(が、のちにこれが原因で時間を溶かすことに…)。)
<br /> $ sudo mkdir -p /samba/share<br /> $ sudo chmod -R 0777 /samba/share<br /> $ sudo chown -R nobody:nobody /samba/share<br /> $ sudo chcon -t samba_share_t /samba/share<br />
ここまで終わったら samba を再起動する。
<br /> $ sudo systemctl reload smb.service<br /> $ sudo systemctl reload nmb.service<br /> $ sudo systemctl restart smb.service<br /> $ sudo systemctl restart nmb.service<br />
(samba は、再起動しなくても自動反映される設定もあるらしいが調べてないので再起動した。)
どうだろう?つながるだろうか??
Windows10からはアクセス認証が必要とか何とかでほげほげ。
Windows10 しかない場合は次を参考に接続する。(コメント欄まで読むとうまくいく)
LDAP と Samba の連携
Samba の認証を LDAP サーバに保存されている情報で行えるようにする(はたしてこの日本語であっているのだろうか)。
LDAP のスキーマを追加
次のコマンドを実行:
<br /> $ ldapadd -x -W -D cn=config -f /etc/openldap/schema/nis.ldif<br /> $ ldapadd -x -W -D cn=config -f /usr/share/doc/samba-4.2.10/LDAP/samba.ldif<br />
このあたりで次をやるべきだったかも?(参考サイトと比較時漏れを発見)
やらなくても動いたが念のため記述: rootエントリを追加する。
<br /> dn: dc=local<br /> objectClass: dcObject<br /> objectClass: organization<br /> dc: local<br /> o: test<br />
<br /> $ ldapadd -x -W -D "cn=Manager,dc=test,dc=yk,dc=local" -f ~/ldap_work/samba-root.ldif<br />
samba の設定を変更
まずは Samba の設定をいじる。
<br /> $ cd /etc/samba/<br /> $ sudo cp smb.conf smb.conf.bk2<br /> $ sudo vi smb.conf<br />
<br />
passdb backend = tdbsam<br />
# 不要なのでコメントアウト<br />
# map to guest = Bad User</p>
<p> # 以下追記<br />
# まだコメントアウト<br />
# passdb backend = ldapsam:"ldap://localhost/"</p>
<p> ldap admin dn = cn=Manager,dc=test,dc=yk,dc=local<br />
ldap suffix = dc=test,dc=yk,dc=local<br />
ldap user suffix = ou=People<br />
ldap group suffix = ou=Group<br />
ldap machine suffix = ou=Hosts<br />
ldap idmap suffix = ou=idmap<br />
ldap ssl = no<br />
# 追記ここまで<br />
LDAP adminパスワードを設定する。
<br /> $ sudo smbpasswd -w パスワード<br />
smbldap-tools のインストール
smbldap-tools は Samba-LDAP 連携のツール集です。
yum コマンドでインストールする。
yum のリポジトリに EPEL を追加していない場合は yum コマンドから追加できるので追加する。
<br /> $ sudo yum install epel-release # EPEL 追加<br /> $ sudo yum install smbldap-tools<br />
対話形式で初期設定する。
smb.conf の ldap suffix などの値と合わせること。
<br /> $ sudo smbldap-config<br />
ただし、自動的に /etc/samba/smb.conf ファイルの値が初期値になっている。
ほとんどは [Enter] キーで進んでいい。
変更するのは ldap master bind password ぐらい。
ldap master bind dn [cn=Manager,dc=test,dc=yk,dc=local] のパスワード。
次に、以下のコマンドで LDAP 内に必要なツリーを作成させる。
<br /> $ sudo smbldap-populate<br />
既存のアカウント情報を移行する(今回は不要説)。
<br /> $ sudo pdbedit -i tdbsam -e ldapsam:ldap://localhost<br />
その後、 smb.conf を再度編集。
<br />
# 次をコメントアウト<br />
# passdb backend = tdbsam<br />
# map to guest = Bad User</p>
<p> # コメントアウトを解除<br />
passdb backend = ldapsam:"ldap://localhost/"<br />
最後に samba を再起動。
<br /> $ sudo systemctl reload smb.service<br /> $ sudo systemctl reload nmb.service<br /> $ sudo systemctl restart smb.service<br /> $ sudo systemctl restart nmb.service<br />
新規ユーザの追加
smbldap-useradd コマンドでユーザを追加する。
<br /> $ sudo smbldap-useradd -a user1<br />
パスワード変更は smbldap-passwd。
<br /> $ sudo smbldap-passwd user1<br />
ログ記録周り
一応、動かしてみた。
<br /> # ファイルの最後に追記<br /> local4.* /var/log/ldap<br />
<br /> dn: cn=config<br /> changetype: modify<br /> replace: olcLogLevel<br /> olcLogLevel: 256<br />
<br /> $ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/ldap_work/loglevel.ldif<br /> $ sudo systemctl restart rsyslog<br />
以下試行錯誤
試しに個人用ディレクトリを作り認証テストするもコケまくり(SELinux忘れ)、おそらく smbldap-useradd コマンド実行時に -a オプションを忘れたためかコケまくったため、様々な試行錯誤が…
以下がその記録。
nss_ldap, pam_ldap, nsswitch 周り
必要かどうかわからないがとりあえず入れたのでまだ残している。
試しに削除した場合は別途更新予定。
<br /> $ sudo yum install nss_ldap pam_ldap<br /> $ sudo vi /etc/nsswitch.conf<br /> $ sudo vi /etc/nslcd.conf<br /> $ sudo systemctl enable nscd<br /> $ sudo systemctl enable nscd.service<br /> $ sudo systemctl restart nscd.service<br /> $ sudo systemctl restart nslcd.service<br />
<br /> - passwd: files sss<br /> - shadow: files sss<br /> - group: files sss<br /> + passwd: files sss ldap<br /> + shadow: files sss ldap<br /> + group: files sss ldap<br />
<br /> - base dc=example,dc=com<br /> + base dc=test,dc=yk,dc=local<br />
今後の調査事項
smb.conf に ldap passwd sync = yes の記述は必要かどうか。(パクリスペクトもとになかったため現在記述なし)
参考
以下をパクリスペクト。
- Qiita: kazukikudo: CentOS7.0でOpenLDAP構築
- Netsphere Laboratories: OpenLDAP の設定
- 俺的備忘録 〜なんかいろいろ〜: CentOS7にSambaをインストール
- kakiro-web カキローウェブ: CentOS7.1 64bitのyumリポジトリにEPELを追加
- Netsphere Laboratories: Samba 4 (スタンドアロン) の認証を LDAP にする
- Qiita: miyumiyu: 外部のLDAPサーバを使ったsamba認証
- その他記録からは漏れてしまった参考元各位
最後に
コメント大歓迎。動かないでもうまくいったでも報告していただけると、助かります。