LDAPサーバとSambaサーバを構築

環境

  • OpenStack のインスタンス上
  • OS: CentOS Linux release 7.2.1511 (Core)
  • LDAPサーバ: OpenLDAP

ほんとにやりたかったこと

あるインスタンス上に LDAP サーバを構築、ユーザ管理。別のインスタンス上の Samba サーバにその情報を用いてログインを行えるようにする(したかった)。

今回は…

動作を把握するため、感覚を養うために同一インスタンス上に LDAP サーバと Samba サーバを構築。(ようは試したがうまくいかなかったのだ。)
LDAP サーバのデータでネットワーク上から Samba サーバにログインして利用できるようにする。

OpenLDAP のインストール

yum コマンドでインストール可能。コマンドラインツールが必要になるので、クライアントパッケージもインストールする。

$ sudo yum -y install openldap openldap-clients openldap-servers

次がインストールされた:

  • 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設定ファイルをサンプルからコピーします。

$ sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

サーバ起動時にslapdサービスを自動起動するように設定し、起動する。

$ sudo systemctl enable slapd
$ sudo systemctl start slapd

firewalld の設定(ldap)

OpenStack上では不要なため省略。
実サーバであれば注意。

設定

下準備

編集用のファイルを保存するディレクトリを作成し、移動。

$ mkdir ~/ldap_work
$ cd ~/ldap_work/

パスワードのハッシュを生成。

$ slappasswd
New password:
Re-enter new password:
{SSHA}KjuXS0F2kb/HCdfjEOmeJw2aNoZUneAY

パスワードに設定したい文字列を「New password」「Re-enter new password」のそれぞれに入力する。
生成された文字列(今回の例では「{SSHA}KjuXS0F2kb/HCdfjEOmeJw2aNoZUneAY」)を使う(のでコピーなどしておく)。

サーバ管理者 (Root DN) のパスワードの設定

ファイル add_rootPw.ldif を次の内容で作る。

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: **パスワード**

**パスワード** の部分は slappasswd で生成したパスワードのハッシュを記述する、以下同様。

ldapadd コマンドで add_rootPw.ldif の内容を登録する。

$ ldapadd -Y EXTERNAL -H ldapi:// -f ~/ldap_work/add_rootPw.ldif

-Y EXTERNALとつけることでローカル環境からパスワード無しでコマンドを実行できる。

LDAPベースエントリの変更

ファイル change-domain.ldif を次の内容で作る。

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=test,dc=yk,dc=local" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=test,dc=yk,dc=local

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=test,dc=yk,dc=local

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: **パスワード**

ldapmodify コマンドで change-domain.ldif の内容を登録する。

$ ldapmodify -x -D cn=config -W -f change-domain.ldif

コマンドを実行すると、パスワードを聞かれるので、先ほど設定したパスワードを入力する。

LDAPベースエントリの登録

ファイル base.ldif を次の内容で作る。

dn: dc=test,dc=yk,dc=local
objectClass: dcObject
objectClass: organization
dc: test
o: test.

dn: ou=People,dc=test,dc=yk,dc=local
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=test,dc=yk,dc=local
objectClass: organizationalUnit
ou: Group

ldapadd コマンドで base.ldif の内容を登録する。

$ ldapadd -x -D "cn=Manager,dc=test,dc=yk,dc=local" -W -f base.ldif

コマンドを実行すると、パスワードを聞かれるので、先ほど設定したパスワードを入力する。
config と Manager でパスワードを変えた時は注意。

ログファイルの参照

CentOS 7.0 からは journal コマンドでログを参照する。

sudo journalctl -u slapd -f

デフォルトのログレベルは stats(256)

ログレベル変更

今回のセットアップでは使用しなかったが、今後のためのメモ。

短いldifなので標準入力から直接投入。

ログレベルを 0 に変更して一切ログを出力されなくする例。

$ ldapmodify -x -D cn=config -W <<EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: 0
EOF

2 回目以降は replace なので以下のようにする。

$ ldapmodify -x -D cn=config -W <<EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: 0
EOF

スキーマの追加

LDAPは、スキーマに合致したデータのみが登録できる。
各種データを登録する前に、それぞれに適したスキーマを有効にする必要がある。

まずは現在追加されているスキーマを確認。

$ ldapsearch -x -LLL -W -D cn=config -b cn=config "(objectClass=olcSchemaConfig)" dn

その後、以下のコマンドでスキーマを追加。

$ ldapadd -x -W -D cn=config -f /etc/openldap/schema/cosine.ldif
$ ldapadd -x -W -D cn=config -f /etc/openldap/schema/inetorgperson.ldif

Samba のインストール

yum コマンドを用いて、必要なパッケージをインストールする。

sudo yum install -y samba samba-client samba-common

sambaの自動起動を有効にして、起動する。

$ sudo systemctl enable smb.service
$ sudo systemctl enable nmb.service
$ sudo systemctl start smb.service
$ sudo systemctl start nmb.service

firewalld の設定(smb)

OpenStack上では不要なため省略。
実サーバであれば注意。

設定

まずは、Samba自体がちゃんと動くことを確認する意味も込めて、ログイン不要で見ることができるディレクトリを作る。

設定ファイル /etc/samba/smb.conf を編集する。

$ cd /etc/samba
$ sudo cp smb.conf smb.conf.bk1 # 念のためバックアップ
$ vi /etc/samba/smb.conf
        passdb backend = tdbsam
        # 以下の行を追加
        map to guest = Bad User
  # ファイルの最後に以下を追加
  [Share]
  path = /samba/share
  browsable = yes
  writable = yes
  guest ok = yes
  read only = no

あくまで例。参考に。

その後、共有に使用するディレクトリを作成し、パーミッション等や SELinux まわりを設定する。
(めんどくさいので SELinux を無効にする人もいるが今回は有効のまま進める(が、のちにこれが原因で時間を溶かすことに…)。)

$ sudo mkdir -p /samba/share
$ sudo chmod -R 0777 /samba/share
$ sudo chown -R nobody:nobody /samba/share
$ sudo chcon -t samba_share_t /samba/share

ここまで終わったら samba を再起動する。

$ sudo systemctl reload smb.service
$ sudo systemctl reload nmb.service
$ sudo systemctl restart smb.service
$ sudo systemctl restart nmb.service

(samba は、再起動しなくても自動反映される設定もあるらしいが調べてないので再起動した。)

どうだろう?つながるだろうか??
Windows10からはアクセス認証が必要とか何とかでほげほげ。

Windows10 しかない場合は次を参考に接続する。(コメント欄まで読むとうまくいく)

LDAP と Samba の連携

Samba の認証を LDAP サーバに保存されている情報で行えるようにする(はたしてこの日本語であっているのだろうか)。

LDAP のスキーマを追加

次のコマンドを実行:

$ ldapadd -x -W -D cn=config -f /etc/openldap/schema/nis.ldif
$ ldapadd -x -W -D cn=config -f /usr/share/doc/samba-4.2.10/LDAP/samba.ldif

このあたりで次をやるべきだったかも?(参考サイトと比較時漏れを発見)
やらなくても動いたが念のため記述: rootエントリを追加する。

dn: dc=local
objectClass: dcObject
objectClass: organization
dc: local
o: test
$ ldapadd -x -W -D "cn=Manager,dc=test,dc=yk,dc=local" -f ~/ldap_work/samba-root.ldif

samba の設定を変更

まずは Samba の設定をいじる。

$ cd /etc/samba/
$ sudo cp smb.conf smb.conf.bk2
$ sudo vi smb.conf
        passdb backend = tdbsam
        # 不要なのでコメントアウト
        # map to guest = Bad User

        # 以下追記
        # まだコメントアウト
        # passdb backend = ldapsam:"ldap://localhost/"

        ldap admin dn = cn=Manager,dc=test,dc=yk,dc=local
        ldap suffix = dc=test,dc=yk,dc=local
        ldap user suffix = ou=People
        ldap group suffix = ou=Group
        ldap machine suffix = ou=Hosts
        ldap idmap suffix = ou=idmap
        ldap ssl = no
        # 追記ここまで

LDAP adminパスワードを設定する。

$ sudo smbpasswd -w パスワード

smbldap-tools のインストール

smbldap-tools は Samba-LDAP 連携のツール集です。
yum コマンドでインストールする。

yum のリポジトリに EPEL を追加していない場合は yum コマンドから追加できるので追加する。

$ sudo yum install epel-release # EPEL 追加
$ sudo yum install smbldap-tools

対話形式で初期設定する。
smb.confldap suffix などの値と合わせること。

$ sudo smbldap-config

ただし、自動的に /etc/samba/smb.conf ファイルの値が初期値になっている。
ほとんどは [Enter] キーで進んでいい。
変更するのは ldap master bind password ぐらい。
ldap master bind dn [cn=Manager,dc=test,dc=yk,dc=local] のパスワード。

次に、以下のコマンドで LDAP 内に必要なツリーを作成させる。

$ sudo smbldap-populate

既存のアカウント情報を移行する(今回は不要説)。

$ sudo pdbedit -i tdbsam -e ldapsam:ldap://localhost

その後、 smb.conf を再度編集。

        # 次をコメントアウト
        # passdb backend = tdbsam
        # map to guest = Bad User

        # コメントアウトを解除
        passdb backend = ldapsam:"ldap://localhost/"

最後に samba を再起動。

$ sudo systemctl reload smb.service
$ sudo systemctl reload nmb.service
$ sudo systemctl restart smb.service
$ sudo systemctl restart nmb.service

新規ユーザの追加

smbldap-useradd コマンドでユーザを追加する。

$ sudo smbldap-useradd -a user1

パスワード変更は smbldap-passwd

$ sudo smbldap-passwd user1

ログ記録周り

一応、動かしてみた。

# ファイルの最後に追記
local4.* /var/log/ldap
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: 256
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/ldap_work/loglevel.ldif
$ sudo systemctl restart rsyslog

以下試行錯誤

試しに個人用ディレクトリを作り認証テストするもコケまくり(SELinux忘れ)、おそらく smbldap-useradd コマンド実行時に -a オプションを忘れたためかコケまくったため、様々な試行錯誤が…
以下がその記録。

nss_ldap, pam_ldap, nsswitch 周り

必要かどうかわからないがとりあえず入れたのでまだ残している。
試しに削除した場合は別途更新予定。

$ sudo yum install nss_ldap pam_ldap
$ sudo vi /etc/nsswitch.conf
$ sudo vi /etc/nslcd.conf
$ sudo systemctl enable nscd
$ sudo systemctl enable nscd.service
$ sudo systemctl restart nscd.service
$ sudo systemctl restart nslcd.service
- passwd:     files sss
- shadow:     files sss
- group:      files sss
+ passwd:     files sss ldap
+ shadow:     files sss ldap
+ group:      files sss ldap
- base dc=example,dc=com
+ base dc=test,dc=yk,dc=local

今後の調査事項

smb.confldap passwd sync = yes の記述は必要かどうか。(パクリスペクトもとになかったため現在記述なし)

参考

以下をパクリスペクト。

最後に

コメント大歓迎。動かないでもうまくいったでも報告していただけると、助かります。

コメント
トラックバック
ページトップへ