LDAPの構築

参考: https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-ubuntu-16-04

OpenLDAPのインストール

sudo apt update
sudo apt install slapd ldap-utils

<パスワードをセット>

$ cd /etc/ldap
$ sudo cp ldap.conf ldap.conf.org
$ diff ldap.conf ldap.conf.org
8,9c8,9
< BASE	dc=a910,dc=tak-cslab,dc=org
< URI	ldap://ldap.a910.tak-cslab.org ldap://ldap-master.a910.tak-cslab.org:666
---
> #BASE	dc=example,dc=com
> #URI	ldap://ldap.example.com ldap://ldap-master.example.com:666
$ sudo slapcat
dn: dc=a910,dc=tak-cslab,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: a910.tak-cslab.org
dc: a910
structuralObjectClass: organization
entryUUID: c94f4c60-8850-1039-8ded-b306a16f182d
creatorsName: cn=admin,dc=a910,dc=tak-cslab,dc=org
createTimestamp: 20191021131650Z
entryCSN: 20191021131650.368566Z#000000#000#000000
modifiersName: cn=admin,dc=a910,dc=tak-cslab,dc=org
modifyTimestamp: 20191021131650Z

dn: cn=admin,dc=a910,dc=tak-cslab,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ME0wRC9wUGRlZ0plelpNQmp4ZmpOKzBVMm5kb0NGQ0s=
structuralObjectClass: organizationalRole
entryUUID: c94f5638-8850-1039-8dee-b306a16f182d
creatorsName: cn=admin,dc=a910,dc=tak-cslab,dc=org
createTimestamp: 20191021131650Z
entryCSN: 20191021131650.368842Z#000000#000#000000
modifiersName: cn=admin,dc=a910,dc=tak-cslab,dc=org
modifyTimestamp: 20191021131650Z
sudo ufw allow ldap

phpLDAPadminのインストール

Dockerの場合

sudo docker run -p 6443:443 \
--env PHPLDAPADMIN_LDAP_HOSTS=auth-primary.a910.tak-cslab.org \
--detach osixia/phpldapadmin:0.9.0

uidとgidの初期設定とハッシュアルゴリズムの初期設定を変更(末尾に以下を追記)

/var/www/phpldapadmin/config/config.php

/*
 * Autogenerated servers variables will come here
 */
$servers->newServer('ldap_pla');
$servers->setValue('server','name','auth-primary.a910.tak-cslab.org');
$servers->setValue('server','host','auth-primary.a910.tak-cslab.org');

// 以下が追記
$servers->setValue('auto_number', 'min', array('uidNumber'=>2000,'gidNumber'=>500));
$servers->setValue('appearance', 'pla_password_hash', 'sha512crypt');

それ以外

$ sudo apt-get install phpldapadmin
$ sudo vim /etc/phpldapadmin/config.php
/*********************************************
 * Define your LDAP servers in this section  *
 *********************************************/

$servers = new Datastore();

/* $servers->NewServer('ldap_pla') must be called before each new LDAP server
   declaration. */
$servers->newServer('ldap_pla');

/* A convenient name that will appear in the tree viewer and throughout
   phpLDAPadmin to identify this LDAP server to users. */
// $servers->setValue('server','name','My LDAP Server');
$servers->setValue('server','name','CDSL LDAP Server');

/* Examples:
   'ldap.example.com',
   'ldaps://ldap.example.com/',
   'ldapi://%2fusr%local%2fvar%2frun%2fldapi'
           (Unix socket at /usr/local/var/run/ldap) */
$servers->setValue('server','host','127.0.0.1');

/* The port your LDAP server listens on (no quotes). 389 is standard. */
// $servers->setValue('server','port',389);

/* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
   auto-detect it for you. */
// $servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('server','base',array('dc=a910,dc=tak-cslab,dc=org'));

/* Hide the warnings for invalid objectClasses/attributes in templates. */
// $config->custom->appearance['hide_template_warning'] = false;
$config->custom->appearance['hide_template_warning'] = false;

Webブラウザからアクセス

http://auth-primary.a910.tak-cslab.org/phpldapadmin/

DN:  cn=admin,dc=a910,dc=tak-cslab,dc=org
PW:  xxxx

エラーが出たのでオリジナルパッチで対応

https://stackoverflow.com/questions/50698477/cant-create-new-entry-phpldapadmin

ログイン後

image.png (259.1 kB)

LDAPクライアントの設定

参考

基本設定

sudo apt-get update
sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd

ldap://192.168.100.7

image.png (340.1 kB)

dc=a910,dc=tak-cslab,dc=org1

image.png (285.8 kB)

image.png (311.8 kB)

cn=admin,dc=a910,dc=tak-cslab,dc=org

設定ファイルを書き換え(認証方式の変更)

変更前 /etc/nsswitch.conf

passwd:         compat systemd
group:          compat systemd
shadow:         compat

変更後 /etc/nsswitch.conf

passwd:         compat systemd ldap
group:          compat systemd ldap
shadow:         compat

ログイン時にディレクトリを作成

sudo sh -c 'echo "session required        pam_mkhomedir.so skel=/etc/skel umask=077" >> /etc/pam.d/common-session'
sudo systemctl restart nscd

設定ファイルの書き換え(passwdコマンドによるパスワード変更を可能)

参考: Bug #329067 “Cannot change password on ldap client, need to have…” : Bugs : libpam-ldap package : Ubuntu

変更前 /etc/pam.d/common-password

password      [success=1 user_unknown=ignore default=die]     pam_ldap.so use_authtok try_first_pass

変更後 /etc/pam.d/common-password

password        [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass

公開鍵スキームを追加

$ wget https://www.osstech.co.jp/~hamano/posts/centos7-openldap-ssh/openssh-lpk-openldap.ldif
$ ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-lpk-openldap.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=openssh-lpk-openldap,cn=schema,cn=config"
ldap_add: Insufficient access (50)

アクセス権限が不足していると怒られるので以下で対処

OpenLDAP-2.4.28セットアップ。ベースDNと管理者DN – JesTech

IDM OIM Blog: ldap_add insufficient access (50) openldap

具体的には /etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif へ以下を追記する.

olcRootDN: cn=config
olcRootPW: {SSHA}TgR7I0OCdRwSNoCvx9zGELeh6PkoPCqA

SLAPDサービスを再起動する.

しかし上手く行かず.下記で上手く行った.

$ ldapadd -D CN=config -W -H ldapi:/// -f openssh-lpk-openldap.ldif
Enter LDAP Password:
adding new entry "cn=openssh-lpk-openldap,cn=schema,cn=config"

以下のスキームも追加する.

$ ldapadd -D CN=config -W -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
$ ldapadd -D CN=config -W -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
$ ldapadd -D CN=config -W -H ldapi:/// -f /etc/ldap/schema/nis.ldif

phpldapadmin(port: 6443/tcp)から ldapPublicKey ObjectClassを追加して公開鍵を追加する.

image.png (80.6 kB)

LDAP 連携を設定したいサーバーに以下の手順を参考にスクリプトを配置する.

SSSD+LDAP+SSH連携の設定 | 外道父の匠

動きが変だったので sed のあたりに修正を加えた.

/etc/ssh/get-ldap-keys.sh

##!/bin/bash                                                                                                                                                   
user="${1}"
host="ldap://auth-primary.a910.tak-cslab.org"
base="dc=a910,dc=tak-cslab,dc=org"
filter1="(& (objectClass=posixAccount) (uid=${user}))"
filter2="sshPublicKey"

id "$user" >/dev/null 2>&1

RESULT=$(ldapsearch -x -LLL -H "$host" -b "$base" "$filter1" "$filter2" \
         | sed -z 's/\n\s\?//g;s/.*sshPublicKey::\? //g;s/.*/&\n/g' )
DECODE=$(echo $RESULT | base64 -d &> /dev/null; echo $?)

if [ $DECODE == "0" ]
then
  echo $RESULT | base64 -d
  echo
else
  echo $RESULT
fi

パーミッションを適切に付与する.

sudo chmod 500 /etc/ssh/get-ldap-keys.sh

SSHサーバのConfigをセットする.

/etc/ssh/sshd_config

AuthorizedKeysCommand /etc/ssh/get-ldap-keys.sh
AuthorizedKeysCommandUser root

https://drive.google.com/drive/u/1/folders/1eoN-gTqFBO6yL7yQjV4AeTeKZedOXkWZ

Sambaのスキーマを追加

スキーマをSambaパッケージから取得

sudo apt install samba
sudo cp /usr/share/doc/samba/examples/LDAP/samba.ldif.gz ~
sudo apt purge samba
sudo apt autoremove

展開して変換

gunzip samba.ldif.gz
sudo cp samba.ldif /etc/ldap/schema/
ldapadd -D CN=config -W -H ldapi:/// -f /etc/ldap/schema/samba.ldif