2017年6月15日

ブロードバンドタワー國武です。

以前の記事で、せっかくマルチマスター構成のLDAPサーバを構築したので、CentOS7, FreeBSD10や nginx から使ってみようかと思います。前回と同じくLDAPサーバは

  • ldap1
    • IPv4: 192.0.2.1/24
  • ldap2
    • IPv4: 192.0.2.2/24

であるとします。

目次

CentOS7 での利用

パッケージの追加

LDAP認証をするには、nss-pam-ldapd を使うのでインストールしておきます。

$ sudo yum -y install nss-pam-ldapd

設定

CentOS7 は、authconfig コマンドがあるので、とても簡単に利用可能です。

前回と同じくホスト名でアクセスできるように、 ldap1, ldap2 を /etc/hosts に設定しておきましょう。

192.0.2.1        ldap1
192.0.2.2        ldap2

この状態で、authconfig コマンドで、認証をLDAPサーバに向けます。

$ sudo authconfig --enableldap --enableldapauth \
             --ldapserver=ldap1,ldap2 --enablemkhomedir \
             --ldapbasedn="dc=ldap,dc=example,dc=co,dc=jp" --update

これで、ldap1, ldap2 どちらか片方が落ちていても認証ができます。また初回ログイン時にホームディレクトリの作成も行われます。

アカウント登録

dn: c=test,ou=People,dc=ldap,dc=example,dc=co,dc=jp
givenName: test
sn: test
cn: test
uid: test
uidNumber: 1001
gidNumber: 1000
userPassword: {SSHA}ないしょ
homeDirectory: /home/test
loginShell: /bin/sh
structuralObjectClass: inetOrgPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
mail: test@example.co.jp

上記のようなLDIFファイルを用意し、LDAPサーバに流し込みます(gitlab, gitbucket, redmineなど、メール・アドレスを必要とするものが多いので、事前にデータとして登録しておいた方が無難です)

FreeBSD 10系での利用

ちょっと手元に FreeBSD 10しかなかったので、以下に。FreeBSD11 も同様に設定可能だと思います。

パッケージの追加

# pkg install nss_ldap openldap-client pam_ldap pam_mkhomedir

FreeBSDでも、ldap1, ldap2 を /etc/hosts に設定しておきましょう。

192.0.2.1        ldap1
192.0.2.2        ldap2

設定

/usr/local/etc/openldap/ldap.conf修正

下記の内容に修正します。

BASE dc=ldap,dc=example,dc=co,dc=jp
URI  ldap://ldap1/ ldap://ldap2/
pam_login_attribute uid

/usr/local/etc/nss_ldap.conf修正

下記の内容に修正します。

base dc=ldap,dc=example,dc=co,dc=jp
uri ldap://ldap1/ ldap://ldap2/

また、

/usr/local/etc/nss_ldap.conf
/usr/local/etc/ldap.conf

の内容は、同じである必要があるのでリンクを張っておきます。

/etc/nsswitch.confの修正

group, passwd に ldap を追記します。結果、ファイルの中身は下記のようになるかと思います。

group: files ldap
group_compat: nis
hosts: files dns
networks: files
#passwd: compat ldap
passwd: files ldap
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files

/etc/pam.d/sshd の編集

下記のように修正します。

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            sufficient      /usr/local/lib/pam_ldap.so      no_warn
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            required        pam_unix.so             no_warn try_first_pass

# account
account         required        pam_nologin.so
account         required        pam_login_access.so
account         required        /usr/local/lib/pam_ldap.so      no_warn ignore_authinfo_unavail ignore_unknown_user
account         required        pam_unix.so

# session
session         required        /usr/local/lib/pam_mkhomedir.so umask=0077
session         required        pam_permit.so

# password
password        required        pam_unix.so             no_warn try_first_pass

実際の反映には sshd の restart が必要です。設定を間違えているとログインできなくなるので、すぐ戻せるように別ウィンドウでもログインして、 su – しておきましょう。

/etc/pam.d/system の編集

同様に、こちらも修正します。

auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            sufficient      /usr/local/lib/pam_ldap.so      no_warn
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            required        pam_unix.so             no_warn try_first_pass nullok

# account
account         required        pam_login_access.so
account         required        /usr/local/lib/pam_ldap.so      no_warn ignore_authinfo_unavail ignore_unknown_user
account         required        pam_unix.so

# session
session         required        /usr/local/lib/pam_mkhomedir.so umask=0022
session         required        pam_lastlog.so          no_fail

# password
password        required        pam_unix.so             no_warn try_first_pass

これで初回ログイン後、ホームディレクトリが作成されるはずです。なお、FreeBSD でログインできない原因の1つとしてよくあるのが、/bin/bash を決めうとしたユーザの追加です。FreeBSD は標準では bash がインストールされていないため、先に挙げたようなエントリーでユーザを追加すると、ログインできません。

Nginxでの認証

Nginxでは、複数のLDAPサーバに認証を向けることができます。nginx.conf に

        ldap_server ldap1 {
                url ldap://ladp1:389/ou=People,dc=ldap,dc=example,dc=co,dc=jp?uid?sub?(objectClass=*)
                require valid_user;
        }
        ldap_server ldap2 {
                url ldap://ldap2:389/ou=People,dc=ldap,dc=example,dc=co,dc=jp?uid?sub?(objectClass=*)
                require valid_user;
        }

で、認証を掛けたいサーバがあれば

server {
                listen 192.0.2.1:443 ssl;
                server_name www.example.co.jp;

                auth_ldap "Forbidden";
                auth_ldap_servers ldap1;
                auth_ldap_servers ldap2;

のように、それぞれを並べて記述しておきます。これで冗長性が保たれます。

Apache 2.4系での利用

認証を掛けたいURIに対して、下記のように設定します。

<Location /doc>
  AuthType BasicAuth
  Name "LDAP Auth”
  AuthBasicProvider ldap
  AuthLDAPURL "ldap://ldap1:389 ldap2:389/ou=People,dc=ldap,dc=example,dc=co,dc=jp?uid?sub?(objectClass=*)”
  AuthLDAPBindDN "cn=Manager,dc=ldap,dc=example,dc=co,dc=jp”
  AuthLDAPBindPassword “ないしょ”
  Require valid-user
</Location>

AuthLDAPURLは、複数行のように見えるかもしれませんが、実際には1行です。もし、3台でのマルチマスタ構成なら

ldap://ldap1:389 ldap2:389 ldap3:389/ou=People....

のような記述となります。

Webアプリでの認証

ウェブアプリで LDAP認証をサポートしているものが増えてきましたが、概ねその挙動は2つぐらいありそうです。

  • 初回ログイン時にアカウントを自動生成してくれるもの
  • 事前にアカウントを生成しておいて、認証だけをあとからLDAPに向けるもの

Redmine, GitlabやGitbucketは前者、Zabbixなどは後者の挙動でしょうか。ただ前者にしても、自動的にアカウントが生成できても、結局、権限設定などは別途必要となるものが多くドキュメントにはよく目を通しておいた方が無難です(まぁ至極当たり前の結論になってしまいましたが……)

あとは、設定に入れられるのはLDAPサーバが1台だけというケースも多いので、冗長化には keepalived や consul などを使ったIPやDNSでの切替えを考慮する必要があります。consul については、今更感もないわけではありませんが、またどこかで記事を書いてみたいと考えています。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

アバター

投稿者: Koichi KUNITAKE

最近は Ansible やら Sphinx 触ってます。IPv6 はボチボチ……