用 LDAP Server 管理 SSH Key login – 設定篇

最近碰到一個問題,就是當 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-net

如圖,左邊有一台 LDAP Server ,  右邊有兩台普通 Linux Server,都是 CentOS,而右邊兩台的認證方式除了本機的 shadow 外還另外增加 LDAP 認證,然後下面有兩台 NB 代表不同 User,必須作到可以限制某個 User 只能連到某台

OpenLDAP Server 的安裝設定

以下盡量減少步驟,因為涉及到 LDAP 一些目錄結構知識,所以能用預設的設定檔內容就用,有興趣的人再另行研究

1. 安裝必要套件

2. 產生 OpenLDAP Server 的管理密碼

注意要把最後產生的 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

測試看看設定檔正不正確

這裡會看到 checksum error,先不管它,有出現 config file testing succeeded 就可,接著創建一個 base.ldif 要作一些初始化

內容自己輸入如下

dn: dc=my-domain,dc=com
objectClass: dcObject
objectClass: organization
dc: my-domain
o : my-domain

接著將這個 base.ldif 匯入

輸入了我們設定的管理者密碼後出現 adding new entry “dc=my-domain,dc=com" 就好了。

設定讓 ldap server 可以將訊息寫入 log

 

增加一行

然後重啟 rsyslog

 

這樣以後就可以在 /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 的套件,所以要自己來,首先看看以下目錄

 

應該會看到以下檔案

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 的部分

會列出

....
 /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,執行以下命令

再來 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

這樣就 ok 了。

安裝 phpLDAPadmin 方便管理 OpenLDAP Server

CentOS 預設是沒有 phpLDAPadmin , 必須要先安裝 EPEL 再安裝 phpldapadmin

這種安裝法會連同 php 還有 httpd 一併安裝,接著要修改 httpd 的設定檔

預設會看到

 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

打開 http://192.168.88.14/ldapadmin 會看見如下圖,代表安裝成功了

LDAP Admin , ldapadmin

LDAP Admin , ldapadmin

最後還要修改一行 /etc/phpldapadmin/config.php , 找到一行

改成

存檔,接著可以試試帳密登入

  • 帳號 : 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 必須安裝

setup

 

選第一項 Authentication configuration

setup2

上圖關於 LDAP 的打勾後按 Next …

setup3

Server 輸入 ldap://192.168.88.14 這是依照我的架構圖上的 IP

Base DN 是 dc=my-domain,dc=com , 這是 ldap server 安裝時預設的我沒改過,打好後就按 OK 就行了。

這時候只是設定好以 LDAP 來認證,但預設用戶第一次認證通過後,會沒有家目錄,所以接下來要設定自動建立家目錄

上面說的設定,只能用密碼認證,但我們還要支援 ssh public key 認證,所以接著要設定 SSH Login 可以使用到 ssh public key

這也必須安裝 openssh-ldap 這個套件,並且需要一個 openssh-ldap  提供的 ldap.conf , 所以步驟如下

 

再來修改 /etc/ssh/sshd_config 這個檔案 , 要確定有以下內容

AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper
PubkeyAuthentication yes

然後重啟 sshd

 

接下來要讓用戶透過 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 來管理用戶。

 

 

參考資料

發表迴響