目次

参考情報

内容

LDAPサーバの構築

  • yumでLDAP関連のパッケージをインストール
    # yum install openldap-servers openldap-clients
  • DB_CONFIGをコピー
    # ln -s /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  • /etc/openldap/slapd.confを修正
    追記include/etc/openldap/schema/samba.schema
    修正suffix"dc=ebisawa,dc=co,dc=jp"
    修正rootdn"cn=Administrator,dc=ebisawa,dc=co,dc=jp"
    追記rootpwコマンド「slappasswd -s <<パスワード>> -h {MD5}」の結果
    追記indexsambaSID eq
    追記access to attribute=userPassword,sambaLMPassword,sambaNTPassword
        by anonymous auth
        by self write
        by * none
  • /etc/syslog.confに次を追加して再起動
    local4.*        /val/log/ldap.log
  • エラーなく起動できるかを確認
    # /etc/init.d/ldap start
  • 自動起動の設定
    # chkconfig ldap on

システムユーザのエントリーを作成

  • 次のファイルを作成
    dn: dc=ebisawa,dc=co,dc=jp
    objectClass: dcObject
    objectclass: organization
    dc: ebisawa
    o: Ebisawa Network
    
    dn: cn=Administrator, dc=ebisawa,dc=co,dc=jp
    objectClass: organizationalRole
    cn:Administrator
    
    dn: ou=People,dc=ebisawa,dc=co,dc=jp
    objectClass: organizationalUnit
    ou: People
    
    dn: ou=Group,dc=ebisawa,dc=co,dc=jp
    objectClass: organizationalUnit
    ou: Group
  • 登録コマンドを実行
    # ldapadd -f base.ldif -x -D "cn=Administrator,dc=ebisawa,dc=co,dc=jp" -W 
  • LDAPの登録情報を確認しておく

ユーザ情報をLDAPに移行

  • 5xx番台のユーザ・グループ情報を抽出して保存
    # grep :5[0-9][0-9] /etc/passwd > user-list
    # grep :5[0-9][0-9] /etc/group  > group-list
  • /usr/share/openldap/migration/migrate_common.ph を修正
    # Default DNS domain
    $DEFAULT_MAIL_DOMAIN = "ebisawa.co.jp";
    
    # Default base
    $DEFAULT_BASE = "dc=ebisawa,dc=co,dc=jp";
  • 追加するユーザ・グループのLDIFを作成
    # /usr/share/openldap/migration/migrate_passwd.pl user-list > user-list.ldif
    # /usr/share/openldap/migration/migrate_group.pl group-list > group.ldif
  • (不要?)次のコマンドでパスワード文字列を生成し、user-list.ldifとgroup.ldifの「userPassword」を修正
    # slappasswd -h '{CRYPT}'
  • 追加コマンド(-Wでパスワードをインタラクティブに指定)
    # ldapadd -f user-list.ldif -x -D "cn=Administrator,dc=ebisawa,dc=co,dc=jp" -W
    # ldapadd -f group.ldif -x -D "cn=Administrator,dc=ebisawa,dc=co,dc=jp" -W

ユーザ情報をLDAPから取得する設定

利用パッケージの確認

  • 別のLDAPサーバを利用する場合(当該サーバにOpenLDAPサーバを構築しない場合)は、次のパッケージがインストールされていることを確認する
    # yum install openldap-servers nss_ldap

LDAPサーバへのアクセスの確認

  • firewall等で遮断されていないことを確認するため、次のコマンドを実行
    # BASE_DN="dc=ebisawa,dc=co,dc=jp"
    # ldapsearch -xvD "cn=Administrator,$BASE_DN" -W -H ldap://<<ldaphost>> -b ou=People,$BASE_DN '(uid=<<username>>)'

OSの基本設定

  • authconfig-tuiコマンドを実行して「Use LDAP」にチェックを入れる
  • 次のファイルが更新されていることを確認
    • /etc/ldap.conf
    • /etc/pam.d/system-auth
    • /etc/nsswitch.conf
  • 64BitOS(RHEL4で確認)の場合、/etc/pam.d/system-authの各ライブラリへのパスを適宜修正する
    /lib64/security/pam_ldap.so

/etc/ldap.confを適宜修正

  • /etc/openldap/ldap.confではない
  • bindpwは平文で記述するため、パーミッションを600に指定(nscdの起動が必須)
    host 127.0.0.1
    base dc=ebisawa,dc=co,dc=jp
    uri ldap://127.0.0.1/
    
    binddn cn=Administrator,dc=ebisawa,dc=co,dc=jp
    bindpw      secret
    port 389
    scope sub
    timelimit 120
    bind_timelimit 120
    bind_policy soft
    idle_timelimit 3600
    ssl no
    pam_password crypt
    
    nss_base_passwd ou=People,dc=ebisawa,dc=co,dc=jp?sub
    nss_base_shadow ou=People,dc=ebisawa,dc=co,dc=jp?sub
    nss_base_group  ou=Group,dc=ebisawa,dc=co,dc=jp?sub
    nss_initgroups_ignoreusers root

ログイン時にホームディレクトリを自動生成する機能

  • /etc/pam.d/system-authに次を追記
    session required pam_mkhomedir.so skel=/etc/skel/ umask=0077

nscdの起動

  • ログイン情報をキャッシュするデーモン
  • これがないとユーザ情報が取得できなくなる(ログインはできるが・・・)
    # /etc/init.d/nscd start

動作検証

  • LDAPからユーザ情報を取得しているか?
    # id username
  • ログイン時にホームディレクトリが生成されるか?
    # su - username

メンテナンス - ユーザを追加するプログラム

概要

  • LDAPにユーザ情報を追加するPerlスクリプト
  • phpLDAPadminでもできることを簡単にまとめてみた
  • ユーザのパスワードはランダム文字列を生成
    • アカウント作成後にpasswdコマンドで調整する
  • GIDは500に固定。気が向いたら、これもオプションで指定できるようにする

スクリプト

#!/usr/bin/perl -w


###===============================================================================
### 概要
###===============================================================================

# LDAPでユーザ管理されている場合にユーザを追加する
# --username でユーザ名を追加

###===============================================================================
### 初期設定など
###===============================================================================

### モジュール
use strict;
use warnings;
use Scalar::Util( "looks_like_number" );
use Getopt::Long;
use Digest::MD5( "md5_hex" );

### LDAPの設定
my $prefix = "dc=ebisawa,dc=co,dc=jp";
my $binddn = "cn=Administrator,${prefix}";
my $basedn = "ou=People,$prefix";
my $ldappw = "******";

###===============================================================================
### 処理開始
###===============================================================================

### ユーザ名
my $userName;
GetOptions ("username=s" => \$userName ) || die( "ERROR: wrong name specified\n" );
die( "ERROR: username not specified\n" ) unless ( $userName );
my $idOpt = "2>/dev/null 1>/dev/null"; 
die( "ERROR: user \"$userName\" already exists\n" ) if ( system( "id $userName $idOpt" ) > 0 );

### uidNumberの最大値を取得
my $ldapUidCmd = << "EOF";
    ldapsearch -x -D $binddn -w $ldappw -b $basedn '(objectClass=posixAccount)' -LLL |
    grep uidNumber: |
    cut -f 2 -d ' ' |
    sort -nr        |
    head -n 1
EOF
my $lastUidNumber = `$ldapUidCmd`;
die( "ERROR: could not get correct uid\n" ) unless ( looks_like_number( $lastUidNumber ) );

### パスワード文字列
my $pwString = md5_hex( time() . $$ );
my $ldifPw   = `slappasswd -s $pwString -h '{CRYPT}'`;
chomp $ldifPw;

### LDIF
my $newUidNumber = $lastUidNumber + 1;
my $LDIF = << "EOF";
    dn: uid=${userName},${basedn}
    uid: ${userName}
    cn: ${userName}
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    userPassword: ${ldifPw}
    shadowLastChange: 14192
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: ${newUidNumber}
    gidNumber: 500
    homeDirectory: /home/${userName}
EOF
$LDIF =~ s/^\s+//gom;

### 一時ファイルを生成
my $tmpLdif = "/tmp/" . time() . "-" . $$ . ".ldif";
open( my $fhTmp, ">$tmpLdif" ) || die( "ERROR: Can't create tmp file: $!" );
print $fhTmp $LDIF;
close $fhTmp;

### LDAPの追加コマンド
system( "ldapadd -x -D $binddn -w $ldappw -f $tmpLdif" );

### ファイルの削除
unlink $tmpLdif;

### 終了
exit;

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-09-25 (日) 19:27:03 (444d)