LINUX使用LDAP進行統一認證

原文地址在:http://blog.thislinux.com/blog/12.html ,轉發請註明。


  redmine、wiki、SVN、私有云平臺都已經使用LDAP打通了認證,下一步就是把所有內網和在線的LINUX sshd全部打通用LDAP作爲認證系統。

    以下所有步驟都能在搜索引擎中找到方案,我只是按我的實際操作過程整理和細化了一下流程,寫得不夠詳細的地方諸位看官請拍磚。


先說說我司的網絡環境:

(1)首先內網、外網有兩個時刻保持同步的LDAP服務器,兩個LDAP如何設置Master/Slave不在本文的討論範圍內,暫且不表。所有員工name、uid、group、uidnumber、publickey等信息都存在這對LDAP中。並用PHP寫了個簡單的ldap管理界面,讓員工可以自行修改密碼、更改publickey,諸如此類。

(2)打比方說明,公司內網網段是10.20.0.0/24,每一個IDC也都有一個獨立的子網網段,如A節點是10.36.0.0/24,B節點是10.80.0.0/24,如此類推。公司內網以及所有IDC相互之間都已經使用GRE over IPsec打通了子網,就是整個運營網絡中,任何兩個主機端點之間都可以互通,就算不能全部互通,任何一個主機端點起碼都能無障礙訪問任何一個LDAP服務器。10.20.0.100和10.36.0.100就是兩個時刻保持同步的LDAP服務器。

(3)我司所有LINUX都是Ubuntu 12.04 LTS或更新版本。


好,真正的操作開始了:

(1)升級sshd到最新的openssh6.7p1版本。


wget http://www.ftp.ne.jp/OpenBSD/OpenSSH/portable/openssh-6.7p1.tar.gz
tar -xf openssh-6.7p1.tar.gz
cd openssh-6.7p1
./configure
make && make install

(2)修改新版本sshd的配置文件/usr/local/etc/sshd_config,摘錄幾個最重要的配置項。這個案例裏,/sshd/ldap/getpub.pl各層子目錄和文件的屬主都必須是root,但是nobody可以讀和運行getpub.pl。

RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
AuthorizedKeysCommand /sshd/ldap/getpub.pl  #使用哪個腳本獲取uid的publickey,uid自動作爲第一個參數輸入
AuthorizedKeysCommandUser nobody  #使用哪個用戶運行這個腳本

(3)腳本/sshd/ldap/getpub.pl範例,範例代碼,大家用自己熟悉的語言重寫一下唄,需要特殊說明一下,ssh_publickey字段就是在LDAP中用於保存員工publickey的字段名,具體字段名取決於你如何設計LDAP樹結構。


#!/usr/bin/perl

die unless $ARGV[0];

open (LDAP, "/usr/bin/ldapsearch -h 10.20.0.100 -L -xb \"ou=login,dc=ejoy.com\" '(&(objectClass=posixAccount)(uid=$ARGV[0]))' ssh_publickey |") || die "ldapsearch failed $!\n";

while (<LDAP>) {
next if /^#|^version|^dn\:|^\s*$/;
s/\n//;
s/\://g;
s/gecos/\n/;
s/^ //;
s/ ssh-rsa/ssh-rsa/;
s/\n//;
print;
}
print "\n";


(4)修改LINUX使用LDAP作爲認證系統。配置方法如下:


#!/bin/bash  

#--------------------------------------------------------------------------------  
LDAP_SERVER_IP="10.20.0.100"
BASE_DN='ou=login,dc=ejoy.com'  
#--------------------------------------------------------------------------------  
  
#創建preseed文件-軟件安裝自應答  
echo > debconf-ldap-preseed.txt  
echo "ldap-auth-config    ldap-auth-config/ldapns/ldap-server    string    ldap://$LDAP_SERVER_IP" >> debconf-ldap-preseed.txt  
echo "ldap-auth-config    ldap-auth-config/ldapns/base-dn    string    $BASE_DN" >> debconf-ldap-preseed.txt  
echo "ldap-auth-config    ldap-auth-config/ldapns/ldap_version    select    3" >> debconf-ldap-preseed.txt  
echo "ldap-auth-config    ldap-auth-config/dbrootlogin    boolean    false" >> debconf-ldap-preseed.txt  
echo "ldap-auth-config    ldap-auth-config/dblogin    boolean    false" >> debconf-ldap-preseed.txt  
echo "nslcd   nslcd/ldap-uris string  ldap://$LDAP_SERVER_IP" >> debconf-ldap-preseed.txt  
echo "nslcd   nslcd/ldap-base string  $BASE_DN" >> debconf-ldap-preseed.txt  
  
cat debconf-ldap-preseed.txt | debconf-set-selections  
  
#安裝ldap client相關軟件  
apt-get install -y ldap-utils libpam-ldap libnss-ldap nslcd  
apt-get install -y python-ldap
#認證方式中添加ldap  
auth-client-config -t nss -p lac_ldap  
  
#認證登錄後自動創建用戶homedir目錄  
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0022" >> /etc/pam.d/common-session  
  
#自啓動服務  
update-rc.d nslcd enable


(5)啓動新版本的opensshd


/usr/local/sbin/sshd -f /usr/local/etc/sshd_config

(6)這樣每個已經在LDAP中開通了權限並正確設置了ssh_publickey的同學可以無障礙登錄所有LINUX機器了。權限控制也已經在LDAP中控制了,我的經驗是把所有的機器羣組都按項目(projectname)來劃分,某位同學如果屬於某個project_group,則他可以登錄這個project的所有機器,如果他同時屬於project_group組和wheel組,則他具備了login和su權限,諸如此類。



這樣做到“自服務”之後,運維組就無需再煩惱爲某個員工添加某臺機器的publickey這個問題了,在一個工程師文化的企業中,40人以下的規模你可以手工添加,如果超過100人,各種key、權限的增刪改將會是一場噩夢,所以LDAP統一認證還是早上早好,當然要重點保護好LDAP服務器的安全,例如設置只讀權限,並用iptables控制合法的來源IP,等等。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章