linux 利用LDAP身份集中認證

碰巧所在的公司用到了ldap 集中身份認證,全部打算研究下這套架構,可是看遍了網絡上的不少教程,要麼不完整,要麼就是照着根本弄不出來,十月一研究了三天,結合八方資源終於弄出來了,真是不容易,哎,特此記錄一把:php

一。實現效果:node

1.實現linux openldap 帳號集中管理linux

2.能夠控制帳號是否能夠sudo 到rootweb

3.能夠實現密碼和pubkey 登錄redis

4.能夠控制用戶能夠登錄到哪些主機數據庫

 

二。系統環境:windows

Red Hat Enterprise Linux Server release 6.7 (Santiago)bash

三。項目拓撲:服務器

採用兩節點演示:網絡

ldap server端: 192.168.85.137  (既充當server端,也作client端)

ldap  client端: 192.168.85.139

四.軟件版本:

openldap-servers-2.4.40-16.el6.x86_64

 #安裝前準備:

1.關閉防火牆及selinux

2.配置hosts解析:

192.168.85.137 node1
192.168.85.139 node2

3.配置ntp時間同步:

ntpdate time.windows.com

 

# 安裝openldap server:

yum install -y openldap-servers-2.4.40-16.el6.x86_64 openldap-clients-2.4.40-16.el6.x86_64 openldap-2.4.40-16.el6.x86_64 openldap-devel-2.4.40-16.el6.x86_64 compat-openldap.x86_64

# 初始化openldap配置:

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
chown -R ldap.ldap /etc/openldap
chown -R ldap.ldap /var/lib/ldap
suffix "dc=hello,dc=com"

#編輯 /etc/openldap/slapd.conf  (修改如下配置,其餘能夠保持默認,或者根據本身需求修改,我這裏只是修改了下面三項)

suffix		"dc=hello,dc=com"            #配置域名後綴,相似最上次的父域名稱
rootdn		"cn=admin,dc=hello,dc=com"   #新建管理員admin
rootpw		{SSHA}LoVG+OZ61YG95bbZbVDZnkotGRSchz+Q    #管理員的password,可使用明文或密文,密文用 slappasswd 生成

#生成配置文件:

rm /etc/openldap/slapd.d/* -fr   #刪除老的配置數據庫
slaptest -f /etc/openldap/slapd.conf   #檢測配置文件是否有語法錯誤
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d #經過slapd.conf生成新的數據庫

  

# 啓動ldap server:

/etc/init.d/slapd start

# openldap 默認使用389,端口,查看服務是否啓動成功:

 

 ############################################# 客戶端配置

# 客戶端部署,安裝openldap client 軟件:

yum install -y openldap-clients.x86_64 nss-pam-ldap

  

# 修改/etc/nslcd.conf ,添加下面內容:

uri ldap://192.168.85.137/
base dc=hello,dc=com
ssl no

  

# 修改/etc/pam_ldap.conf,增長下面內容:

base dc=hello,dc=com
uri ldap://192.168.85.137/

  

# 修改/ /etc/pam.d/system-auth

auth    required    pam_env.so
auth    sufficient   pam_unix.so nullok try_first_pass
auth    requisite    pam_succeed_if.so uid>=500 quiet
auth    sufficient   pam_ldap.so   #增長ldap模塊
auth     required    pam_deny.so
 
account   required   pam_unix.so
account   sufficient   pam_succeed_if.so uid<500 quiet
account   required    pam_ldap.so  #增長ldap模塊
account   required    pam_permit.so
 
password   requisite   pam_cracklib.so  try_first_pass retry=3
password   sufficient   pam_unix.so md5 shadow nullok try_first_pass use_authtok
password   sufficient   pam_ldap.so  use_authtok md5    #增長ldap模塊
password    required   pam_deny.so
 
session     optional    pam_keyinit.so  revoke
session     required    pam_limits.so
session     [success=1  default=ignore]pam_succeed_if.so service in crond quiet
session     required    pam_unix.so
session  required   pam_mkhomedir.so skel=/etc/skel/ umask=0022
session   optional  pam_ldap.so           #增長ldap模塊

 

# 修改/etc/pam.d/sshd  (ssh登錄的話須要用到這個文件,若是隻修改/etc/pam.d/system-auth的話控制檯登錄沒問題,可是若是遠程ssh 鏈接就會出現問題)

auth    required    pam_env.so
auth    sufficient   pam_unix.so nullok try_first_pass
auth    requisite    pam_succeed_if.so uid>=500 quiet
auth    sufficient   pam_ldap.so use_first_pass   #加載ldap
auth     required    pam_deny.so
account   required   pam_unix.so
account   sufficient   pam_succeed_if.so uid<500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so    #加載ldap
account   required    pam_permit.so
password   requisite   pam_cracklib.so  try_first_pass retry=3
password   sufficient   pam_unix.so md5 shadow nullok try_first_pass use_authtok
password   sufficient   pam_ldap.so  use_authtok    #加載ldap
password    required   pam_deny.so
session     optional    pam_keyinit.so  revoke
session     required    pam_limits.so
session     [success=1  default=ignore]pam_succeed_if.so service in crond quiet
session     required    pam_unix.so
session  required   pam_mkhomedir.so skel=/etc/skel/ umask=0022     #自動建立用戶家目錄
session   optional  pam_ldap.so                                     #加載ldap模塊

  

 

# 修改/etc/nsswitch.conf,指定查找順序:

passwd:     files ldap
shadow:     files ldap
group:      files ldap

# 修改 /etc/sysconfig/authconfig

USESHADOW=yes
USELDAPAUTH=yes
USELOCAUTHORIZE=yes
USELDAP=yes

# 新建ou,用來存放用戶:

dn: ou=People,dc=hello,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# 新建ou,用來存放組:

dn: ou=Group,dc=hello,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

# 新建用戶 user200

dn: uid=user200,ou=People,dc=hello,dc=com
uid: user200
cn: user200
sn: user200
objectClass: posixAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: shadowAccount
userPassword: {CRYPT}-s2a6QekMTXp6    #這裏填的是密文密碼,用slappasswd -c -s  命令生成
shadowLastChange: 18171
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 5204
gidNumber: 5204
homeDirectory: /home/user200

 

NOTE:雖然能夠填明文密碼,也能夠填密文密碼,可是若是想要結果linux 登錄,就必須填slappasswd -c -s 生成的密碼,這個命令生成crypt(3) 加密的格式,linux 能夠識別,網上雖說能夠用明文,可是我反正沒有嘗試成功。

 

# 啓動ldap 客戶端

/etc/init.d/nslcd start

 

配置完成,能夠進行ssh 遠程鏈接了

 

 

 

 

############################## 配置用戶sudo

##### 服務器配置

 1.能夠經過本地sudo文件,也能夠經過ldap server 端配置sudo,這裏利用ldap server端來配置

# 拷貝sudo schema 

 cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema

# 編輯/etc/slapd.conf ,增長下面配置:

include /etc/openldap/schema/sudo.schema

# 生成新的數據庫配置:

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap.ldap /etc/openldap/slapd.d/   #賦權,否則啓動sladp 會報錯
/etc/init.d/sladp restart    #重啓服務讓配置生效

 

# 最好裝好phpldapadmin,這個web界面可讓咱們圖形化操做ldap,具體安裝過程能夠google,這裏省略,還有須要注意的一點是若是用yum 安裝的 phpldapadmin可能始終會提示密碼錯誤,具體緣由沒有去研究,到網上下載源碼本身安裝下就行了,沒必要去糾結

 

# 新建 sudoers Ou:

dn: ou=sudoers,dc=hello,dc=com
ou: sudoers
objectClass: top
objectClass: organizationalUnit

# 新建組admin:

dn: cn=admin,ou=group,dc=hello,dc=com
cn: admin
gidNumber: 505
objectClass: posixGroup
objectClass: top

  

# 新建sudo 規則:

dn: cn=%admin,ou=sudoers,dc=hello,dc=com
objectClass: sudoRole
cn: %admin
sudoUser: %admin
sudoHost: ALL
sudoRunAsUser: root
sudoOption: !authenticate
sudoCommand: /bin/bash
EOF

# 將用戶加入admin組,這個這個用戶就有了sudo 到root 的權限

cat >> modify_gid.ldif << EOF

dn: uid=user200,ou=People,dc=hello,dc=com
changetype: modify
replace: gidNumber
gidNumber: 505

EOF


ldapmodify -x -W -D "cn=admin,dc=hello,dc=com" -f modify_gid.ldif

 

### 客戶端配置:

cat >> /etc/nsswitch.conf << EOF
sudoers:    ldap    files
EOF

 

 

 

########################################## 配置ssh 祕鑰登錄

# 拷貝 schema

cp /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema /etc/openldap/schema/

#  /etc/openldap/sladp.conf 增長ssh schema

include /etc/openldap/schema/openssh-lpk-openldap.schema

# 從新生成新的配置文件:

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap.ldap /etc/openldap/slapd.d/ #賦權,否則啓動sladp 會報錯
/etc/init.d/sladp restart #重啓服務讓配置生效

# 配置sshldap 配置文件  (個人環境沒有配置設個配置文件也沒有出問題,還不知道何時會用這個配置,可是仍是配上吧,保險起見)

cp /usr/share/doc/openssh-ldap-5.3p1/ldap.conf /etc/ssh/

# 增長下面配置文件到/etc/ssh/ldap.conf

uri ldap://192.168.85.137/
base dc=hello,dc=com
ssl no

 

# 配置 /etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/bin/get_pubkey   #這個命令能夠本身實現,只要最終能獲取pubkey就好了,切結配置末尾不要有空格,不然會報錯。
AuthorizedKeysCommandRunAs nobody

 

# get_pubkey 內容(其實就是鏈接ldap 服務器而後把key 取回來):

#!/bin/sh -e
ldapsearch -x -D 'cn=admin,dc=hello,dc=com' -w 123qaz\! \
-b 'ou=People,dc=hello,dc=com' -H ldap://192.168.85.137 '(&(objectClass=posixAccount)(uid='"$1"'))' \
'sshPublicKey' \
| sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

 

# user200增長新的屬性以支持pubkey:

cat >> add_objectclass.ldif << EOF
dn: uid=user200,ou=People,dc=hello,dc=com changetype: modify add: objectclass objectClass: ldapPublicKey - add: sshPublicKey sshPublicKey: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxKFoN4eC4bkKYDjK7YoivzGz2tpHbL2Gu4fyEIHrVDuxFwBHt2sKNG/Y56xDIwaMczeLgJkymjzfq7bZTJxZHAKN4x3qvzBA0UYSjnbr3YM9yMKqCllEWMjhVCchDI7vclO/VhsZRB/rSsGivIQjPEzwnn7qcnPhkqte6pa5i5C71NlcFf2Bz3HIE6zpcRFKEYrQgEcJa2fNFDUuY9PN5O1KRahSIPmg2mvWrr7DgTzI+TjCtlxrZuWXJPmJUuV2CWl9J4xcq5KV8Pf8LwlTvIuLx1hnYhojelM7LE4jh2mXweWl4My8xoeOw5hhJ9ekGTQgi1EeooVexguDHo/pnQ== root@node
EOF

 

# 向ldap server提交user200屬性的的修改

 ldapadd -x -w 123qaz\! -D "cn=admin,dc=hello,dc=com" -f add_objectclass.ldif

 

########################################### 限制用戶只能登錄指定的主機

默認狀況下用戶能夠登錄全部的主機,此時咱們能夠限制用戶能夠登錄哪些指定的主機,能夠在客戶端上配置 /etc/security/access.conf ,也能夠在openldap中限制,這裏在openldap server端控制:

1.能夠基於host 限制一個用戶登錄哪些主機

2.也能夠基於主機限制一個主機容許哪些用戶登錄  

 

########## 限制用戶能夠登錄哪些主機:

# 導入新的schema

cat > /etc/openldap/schema/ldapns.schema << EOF
attributetype ( 1.3.6.1.4.1.5322.17.2.1 NAME 'authorizedService' DESC 'IANA GSS-API authorized service name' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributetype ( 1.3.6.1.4.1.5322.17.2.2 NAME 'loginStatus' DESC 'Currently logged in sessions for a user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch ORDERING caseIgnoreOrderingMatch SYNTAX OMsDirectoryString ) objectclass ( 1.3.6.1.4.1.5322.17.1.1 NAME 'authorizedServiceObject' DESC 'Auxiliary object class for adding authorizedService attribute' SUP top AUXILIARY MAY authorizedService ) objectclass ( 1.3.6.1.4.1.5322.17.1.2 NAME 'hostObject' DESC 'Auxiliary object class for adding host attribute' SUP top AUXILIARY MAY host ) objectclass ( 1.3.6.1.4.1.5322.17.1.3 NAME 'loginStatusObject' DESC 'Auxiliary object class for login status attribute' SUP top AUXILIARY MAY loginStatus )
EOF

# 配置/etc/slapd.conf,加入下面內容:

include     /etc/openldap/schema/ldapns.schema

modulepath /usr/lib64/openldap
moduleload dynlist.la

overlay dynlist
dynlist-attrset inetOrgPerson labeledURI

 

# 從新生成數據庫配置:

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap.ldap /etc/openldap/slapd.d/   #賦權,否則啓動sladp 會報錯
/etc/init.d/sladp restart    #重啓服務讓配置生效

# 定義主機組redis和webserver,兩個組裏包含不一樣的主機:

cat << EOF | ldapadd -x -W -H ldaps:/// -D cn=admin,dc=hello,dc=com
dn: ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
ou: servers

dn: ou=redis,ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
objectClass: hostObject
ou: redis
host: node1
host: node2

dn: ou=webserver,ou=servers,dc=hello,dc=com
objectClass: organizationalUnit
objectClass: hostObject
ou: webserver
host: node1
EOF

 

# 用戶增長新的屬性,用來支持自動讀取主機組裏主機

dn: uid=user200,ou=People,dc=hello,dc=com
changetype: modify
add: objectClass
objectClass: hostObject
-
add: labeledURI
labeledURI: ldap:///ou=webserver,ou=servers,dc=hello,dc=com?host

 

#客戶端/etc/pam_ldap.conf 增長配置:

pam_check_host_attr yes

 

# 經過上面的配置客戶端已經能夠自動獲取主機組裏配置的主機,可是如今是以組爲單位,若是這是要單獨加一臺不屬於任何組的主機,能夠直接給用戶添加host 屬性,而後單獨加入要登陸的hostname:

cat >> add_objectclass.ldif << EOF
dn: uid=user200,ou=People,dc=hello,dc=com changetype: modify add: host host: node3
EOF

ldapadd -x -w 123qaz\! -D "cn=admin,dc=hello,dc=com" -f add_objectclass.ldif

ok!,如今新增了一臺主機Nod3

 

NOTE: 這樣只能基於客戶端的主機名來限制用戶登錄,當用戶登陸時客戶端會從ldap 查詢用戶屬性裏的host 字段是否和要登陸的host 的hostname一致,若是一致就能夠登錄,或則拒絕,全部必定要保證hostname 和屬性利配置一致,並且若是要經過ssh登錄,必須保證/etc/pam.d/sshd 文件配置正確,不然檢查host不會生效(具體配置本文開頭已給出)

 

## 下面是第二種方式:指定主機容許哪些用戶登錄:

# 添加hosts 設備

dn: cn=node2,ou=servers,dc=hello,dc=com
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.85.139
cn: node2
uniquemember: uid=user200,ou=people,dc=hello,dc=com  #指定容許登錄用戶

 

# 客戶端配置:

/etc/pam_ldap.conf 增長配置:

pam_groupdn cn=node2,ou=servers,dc=hello,dc=com
pam_member_attribute uniquemember

 NOTE: 也能夠藉助下面兩種方法實現(具體沒去研究):

1./etc/pam_ldap.conf :

  pam_filter memberOf=cn=IP,ou=Hosts,dc=hello,dc=com 

2./etc/nslcd.conf: 

  filter shadow (&(objectClass=posixAccount)(memberOf=cn=IP,ou=Hosts,dc=hello,dc=com))
  filter passwd (&(objectClass=posixAccount)(memberOf=cn=IP,ou=Hosts,dc=hello,dc=com))

 

到這裏已經完成了基本功能了,還有不少沒有作,例如 訪問控制,拒絕匿名用戶訪問,密碼保護,密碼字段禁止隨便讀,TLS,主從同步等,總之若是生成環境用的話這些都是不可避免的。ldap 網上能用的資料太少了,不多看了一篇教程就能徹底搭出來,只是說若是在搭建過程當中卡住了,這時候能夠找下教程,說不定正好解決了你的問題,我一開始網上研究了下ldap,感受雲裏霧裏,理論太多,並且都比較抽象,後來買了本書叫 openldap實戰指南,是某大勇寫的,哎,看完一萬個草泥馬,不少地方按照他的文檔根本搞不定,並且節奏太快,若是沒有點linux 工做經驗可能根本就看不懂,更抽的是那本書居然沒有提供書裏的代碼下載地址,全靠手敲。最後結合那本書和百度,谷歌各類鼓搗,花了三天,終於所有搞完了。總之ldap 這玩意兒,功能感受仍是挺強大的,建議仍是靜下心來研究下基礎,不然網上的教程文檔可能你根本就看不懂,這也情有可原,沒人有義務或者有時間免費寫一個小白教程,都只是以文檔形式記錄下本身的過程拿來本身備忘的。

搭建有幾個點卡了很長時間:

1.AuthorizedKeysCommand /usr/bin/get_pubkey.sh     #這裏是配置sshd 去ldap獲取公鑰的程序,配置的時候不當心在最後面多敲了空格,致使用戶登錄的時候 cat /var/log/secure 始終找不到這個腳本。

2.配置了限制用戶主機登錄後未生效,用戶依然能夠ssh登錄全部主機 ,可是經過控制檯登錄卻生效   #由於用戶ssh登錄時 檢查的是/etc/pam.d/sshd ,最後從新配置了這個文件問題解決

3.新建用戶是指定了明文密碼,可是ssh 登錄卻失敗,始終提示密碼不正確     #最後看官網,linxu 支持crypt(3) 格式加密,後來用 slappasswd -c -s  從新生成密碼後問題解決。 

相關文章
相關標籤/搜索