最近碰到一個問題,就是當 Server 很多台,但是只開放 SSH Key 的方式給人 login 會遇到管理上的麻煩,假如 Server 數量很多,就必須一台台來增加帳戶及 SSH Public key,當要停權某個用戶的時候也必須這麼幹,所以去搜了一下 Google,LDAP Server 除了可以統一管理帳戶外,也可以存放 SSH Public key,於是來實作看看。
這次實作的目標必須如下 :
- LDAP Server 集中管理帳號及存放 SSH Public key
- 每開一個新用戶必須自動建立 home directory
- 將用戶由 LDAP Server 中停權後,該用戶無法用 SSH Key 的方式 Login 任何一台 Server
- 可以由 LDAP Server 設定用戶是否可以執行 sudo
- 可以限制某些用戶無法登入某些 Server
- 當然最重要是要方便用 phpldapadmin 來管理
環境則是採用 CentOS 6 來測試,由於要完整說明整個系統架設和如何管理用戶,所以會分設定篇和管理篇,兩篇文章來說明。
基本架構
如圖,左邊有一台 LDAP Server , 右邊有兩台普通 Linux Server,都是 CentOS,而右邊兩台的認證方式除了本機的 shadow 外還另外增加 LDAP 認證,然後下面有兩台 NB 代表不同 User,必須作到可以限制某個 User 只能連到某台
OpenLDAP Server 的安裝設定
以下盡量減少步驟,因為涉及到 LDAP 一些目錄結構知識,所以能用預設的設定檔內容就用,有興趣的人再另行研究
1. 安裝必要套件
[root@ldap /]# yum install openldap-servers openldap-clients openssh-ldap [root@ldap /]# service slapd start
2. 產生 OpenLDAP Server 的管理密碼
[root@ldap /]# slappasswd New password: Re-enter new password: {SSHA}tldWavF67WvAaXoOCqDzWCf4YhyRg7CJ
注意要把最後產生的 SSHA 密碼複製起來。
3. 用 ldapmodify 將密碼寫入到資料庫 , 以下這段基本上可以直接貼上,注意紅字部分要自己修改
[root@ldap /]# ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}tldWavF67WvAaXoOCqDzWCf4YhyRg7CJ
EOF
測試看看設定檔正不正確
[root@ldap /]# slaptest -u 559faa34 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif" config file testing succeeded
這裡會看到 checksum error,先不管它,有出現 config file testing succeeded 就可,接著創建一個 base.ldif 要作一些初始化
[root@ldap /]# cd /tmp [root@ldap /tmp]# vim base.ldif
內容自己輸入如下
dn: dc=my-domain,dc=com objectClass: dcObject objectClass: organization dc: my-domain o : my-domain
接著將這個 base.ldif 匯入
[root@ldap tmp]# ldapadd -x -W -D "cn=Manager,dc=my-domain,dc=com" -f base.ldif Enter LDAP Password: adding new entry "dc=my-domain,dc=com"
輸入了我們設定的管理者密碼後出現 adding new entry "dc=my-domain,dc=com" 就好了。
設定讓 ldap server 可以將訊息寫入 log
vim /etc/rsyslog.conf
增加一行
local4.* /var/log/ldap.log
然後重啟 rsyslog
service rsyslog restart
這樣以後就可以在 /var/log/ldap.log 看到各種訊息了。
另外,若要讓其它連接到 LDAP Server 的 Server 的用戶可以下 passwd 改密碼,還必須下這到命令(整段可直接貼上)
ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF dn: olcDatabase={2}bdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc=my-domain,dc=com" write by anonymous auth by * none olcAccess: {1}to * by dn.base="cn=Manager,dc=my-domain,dc=com" write by self write by * read" EOF
這道命令是 OpenLDAP 的 ACL 設定,沒下的話,將來用戶下 passwd 改密碼會不能改。
讓 LDAP Sever 支援 ssh 及 sudo
預設 CentOS 中並沒有內建讓 LDAP 支援 ssh 及 sudo 的套件,所以要自己來,首先看看以下目錄
ls -la /etc/openldap/slapd.d/cn=config/cn=schema
應該會看到以下檔案
cn={0}corba.ldif cn={10}ppolicy.ldif cn={11}collective.ldif cn={1}core.ldif cn={2}cosine.ldif cn={3}duaconf.ldif cn={4}dyngroup.ldif cn={5}inetorgperson.ldif cn={6}java.ldif cn={7}misc.ldif cn={8}nis.ldif cn={9}openldap.ldif
這些檔案並沒有 sudo.ldif 及 openssh-lpk-openldap.ldif 所以沒辦法讓以後建立的 user 支援 sudo 及 ssh 登入,所以我們要自己弄,先來搞 sudo 的部分
rpm -qal | grep sudo
會列出
....
/usr/share/doc/sudo-1.8.6p3/sample.sudoers
/usr/share/doc/sudo-1.8.6p3/sample.syslog.conf
/usr/share/doc/sudo-1.8.6p3/schema.ActiveDirectory
/usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP
/usr/share/doc/sudo-1.8.6p3/schema.iPlanet
.....
我們會發現到 sudo 套件有個 schema.OpenLDAP,必須要先複製這個檔案到 /etc/openldap/schema,執行以下命令
cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema
再來 openssh 的部分
[root@ldap /]# rpm -qal | grep openssh-ldap /usr/share/doc/openssh-ldap-5.3p1 /usr/share/doc/openssh-ldap-5.3p1/HOWTO.ldap-keys /usr/share/doc/openssh-ldap-5.3p1/ldap.conf /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-sun.schema
我們需要 openssh-lpk-openldap.schema ,直接 copy 至 /etc/openldap/schema 就行了
cp /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema /etc/openldap/schema
接著是重新建立 ldif 如下,步驟如下
1. 先在 /tmp 下建立 schema_convert.conf , 內容如下
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/sudo.schema
include /etc/openldap/schema/openssh-lpk-openldap.schema
2. 在 /tmp 執行以下命令作轉換,並且重啟 ldap server
[root@ldap tmp]# slaptest -f schema_convert.conf -F /etc/openldap/slapd.d config file testing succeeded [root@ldap /tmp]# chown -Rf ldap:ldap /etc/openldap/slapd.d [root@ldap openldap]# service slapd restart
這樣就 ok 了。
安裝 phpLDAPadmin 方便管理 OpenLDAP Server
CentOS 預設是沒有 phpLDAPadmin , 必須要先安裝 EPEL 再安裝 phpldapadmin
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm yum install phpldapadmin
這種安裝法會連同 php 還有 httpd 一併安裝,接著要修改 httpd 的設定檔
vim /etc/httpd/conf.d/phpldapadmin.conf
預設會看到
Allow from 127.0.0.1 Allow from ::1
這代表只能由 127.0.0.1 本機才能使用,所以不方便,由於我的實作是以 192.168.88.XX 的區段,所以我就增加
Allow from 192.168.88.0/255.255.255.0
存檔後,重新 restart httpd
service httpd restart
打開 http://192.168.88.14/ldapadmin 會看見如下圖,代表安裝成功了
LDAP Admin , ldapadmin
最後還要修改一行 /etc/phpldapadmin/config.php , 找到一行
$servers->setValue('login','attr','uid');
改成
$servers->setValue('login','attr','dn');
存檔,接著可以試試帳密登入
- 帳號 : cn=Manager,dc=my-domain,dc=com
- 密碼 : 依照之前所設的密碼
上面的帳號是 OpenLDAP 預設的 dn , 以後可以研究一下 OpenLDAP 觀念看看怎麼改,我只是記錄一下怎麼安裝,以後方便管理,不然 OpenLDAP 設定實在很複雜啊 ...
讓 phpldapadmin 支援 sudo 的設定
phpldapadmin 預設是不支援 sudo 的設定,所以要到下面的網址抓 template
http://phpldapadmin.sourceforge.net/wiki/index.php/TemplatesContributed:Sudo
在這網址中有 Creation Template 及 Modification Template , 分別將內容複製後建立在出以下兩個檔案
/usr/share/phpldapadmin/templates/creation/sudo.xml /usr/share/phpldapadmin/templates/modification/sudo.xml
然後 phpldapadmin 自動會載入,而在 phpldapadmin 中必須先建立 ou=sudoers 才有辦法使用,這會在另一篇管理篇中說明。
設定各 Server 的帳戶授權改用 LDAP 支援 sudo,並且可於第一次 login 時自動建立家目錄
到目前為止,ldap server 端的部分都設定好了,接下來回頭看看文章開頭看到的架構圖,我要設定另外兩台 Linux Server採用 LDAP 來當作認證,我用的方式比較簡單,直接用 setup 命令,如果系統沒有 setup 必須安裝
yum install setuptool setup
選第一項 Authentication configuration
上圖關於 LDAP 的打勾後按 Next ...
Server 輸入 ldap://192.168.88.14 這是依照我的架構圖上的 IP
Base DN 是 dc=my-domain,dc=com , 這是 ldap server 安裝時預設的我沒改過,打好後就按 OK 就行了。
這時候只是設定好以 LDAP 來認證,但預設用戶第一次認證通過後,會沒有家目錄,所以接下來要設定自動建立家目錄
# yum install -y oddjob-mkhomedir oddjob # chkconfig oddjobd on # service messagebus start Starting system message bus: [ OK ] # service oddjobd start Starting oddjobd: [ OK ] # authconfig --enablemkhomedir --update Starting oddjobd: [ OK ]
上面說的設定,只能用密碼認證,但我們還要支援 ssh public key 認證,所以接著要設定 SSH Login 可以使用到 ssh public key
這也必須安裝 openssh-ldap 這個套件,並且需要一個 openssh-ldap 提供的 ldap.conf , 所以步驟如下
yum install openssh-ldap cp /usr/share/doc/openssh-ldap-5.3p1/ldap.conf /etc/ssh
再來修改 /etc/ssh/sshd_config 這個檔案 , 要確定有以下內容
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper PubkeyAuthentication yes
然後重啟 sshd
service sshd restart
接下來要讓用戶透過 LDAP 支援 sudo 必須修改兩個檔案
編輯 /etc/sudo-ldap.conf , 將下面兩行加入
uri ldap://192.168.88.14/ sudoers_base dc=my-domain,dc=com
編輯 /etc/nsswitch.conf ,增加下面一行以支援認證的時候會先判斷本機 sudo 設定檔再判斷 ldap 的設定
sudoers: files ldap
終於搞定了,由於整個系統要搞起來,要寫的很多,所以將設定的部分獨立寫到此結束,另外有個管理篇是介紹以 phpldapadmin 來管理用戶。
參考資料
- Another I.T. blog : HOWTO : Configure OpenSSH to Fetch Public Keys from OpenLDAP for Authentication on CentOS
- Creating a User Home directory when you use LDAP Authentication
- How Install and Configure OpenLDAP on CentOS / RHEL Linux
- Setting up OpenLDAP on CentOS 6
- RedHat LDAP-Sudo
- Auto-creation of user home directories in Centos/RHEL 6