天天看点

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权限,诸如此类。

继续阅读