原文地址在: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,等等。
转载于:https://blog.51cto.com/longweijin/1619766