原文地址在: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,等等。