Linux下用户启用Windows AD做集中认证
Why
为什么要做服务器的集中认证(和统一权限管理)呢?简答之:当服务器数量呈几何级增长之后,为每台机器维护单独的用户系统已经成为了一个几乎不可能完成的任务(试想下为一万台服务器上的每个用户每三个月修改一次密码),虽然现在也可以通过类似于ansible之类的工具也可以比较容易地做到,但我们有更好的解决方案—-统一认证,这样,只需要在一个地方维护用户数据即可,这样简洁可靠的方案,肯定比ansible之类的方案更胜一筹呀。
How to
一句话;用sssd。不过sssd在这两个系统下都能跑,但这里为嘛把CentOS 6.x和7.x的系统分开讲呢?答案简单:由于CentOS 7.x下有realm从而使得配置巨简单而CentOS 6.x下没有realm(也不好编译使用,因为realm其依赖的某个软件包(glib2>=2.36)版本很高,而且那是一个及其重要的核心软件包,CentOS 6.x不好强行升级到这个版本)所以导致两个版本的配置方法不一样。
背景环境
- xxx.corp: 是贵司Windows AD上的主域名
- AD1.xxx.corp: 是贵司Windows AD上xxx.corp这个域的全局主域控制器
- LoginNO: 是贵司AD域xxx.corp中一个组
- Daha.Ma: 是贵司AD域xxx.corp中的一个普通用户
- SudoNO: 是贵司AD域xxx.corp中一个组
- admin.win: 是贵司AD域xxx.corp中的一个具有管理员权限的用户
具体部署
CentOS 6.x
安装软件
1 | yum -y install sssd oddjob oddjob-mkhomedir \ |
修改配置
krb5.conf
1 | vim /etc/krb5.conf |
使得看起来像这样:
1 | [logging] |
sssd.conf
1 | vim /etc/sssd/sssd.conf |
修改内容如下:
1 | [sssd] |
sudoer
1 | visudo |
添加这么一句:
1 | %[email protected] ALL=(ALL) ALL |
现在的情况将是:
- 除了LoginNO组和Daha.Ma以外其他域账号不能登录
- SudoNO组可以不用密码通过sudo执行任何命令
重启服务
1 | chmod 600 /etc/sssd/sssd.conf; |
维护命令
1 | id [email protected]; # 从AD中获取域用户信息 |
常见问题
不能加入域
当前面adcli join xxxxxx时如果出错:
adcli: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (Server not found in Kerberos database)
的话,请尝试修改/etc/krb5.conf,在[libdefaults]这个区块下加一句:
1 | rdns = false |
然后重新再试,即可。
CentOS 7.x
安装软件
1 | yum -y install \ |
修改配置
sudoer
1 | visudo |
添加这么一句:
1 | %[email protected] ALL=(ALL) ALL |
sssd.conf
1 | vim /etc/sssd/sssd.conf |
修改两句如下:
1 | use_fully_qualified_names = False |
重启服务
1 | systemctl restart sssd; |
现在的情况是:
- 除了LoginNO组以外其他域账号不能登录
- SudoNO组有不需要密码通过sudo执行所有命令的权限
维护命令
1 | realm permit --withdraw -g [email protected]; # 取消LoginNO组的登录权限 |
常见问题
sssd不能启动
1 | systemctl start sssd |
时失败,看 log 文件:/var/log/sssd/sssd_xxx.corp.log 里有错误提示:
[sssd[be[xxx.corp]]] [dp_module_open_lib] (0x0010): Unable to load module [ad] with path [/usr/lib64/sssd/libsss_ad.so]: /lib64/libsamba-credentials.so.0: symbol GSS_KRB5_CRED_NO_CI_FLAGS_X, version gssapi_krb5_2_MIT not defined in file libgssapi_krb5.so.2 with link time reference
[sssd[be[xxx.corp]]] [dp_target_init] (0x0010): Unable to load module ad
[sssd[be[xxx.corp]]] [be_process_init] (0x0010): Unable to setup data provider [1432158209]: Internal Error
[sssd[be[xxx.corp]]] [main] (0x0010): Could not initialize backend [1432158209]
这里的问题是由于一个系统 bug:
samba-client-libs-4.4.4-12.el7_3.x86_64 对 krb5-libs 的依赖关系没正确设置导致的。
具体:
- sssd 包调用 sssd-ad 包来做跟 windows AD 之间的沟通
- sssd-ad 依赖于包 samba-client-libs
- samba-client-libs 又依赖于 krb5-libs
- 由于samba-client-libs 对 krb5-libs 的依赖关系不对,导致 yum install sssd 的时候没有升级正确的 krb5-libs 包,所以导致 sssd 起不来
解决方法很简单,前面安装的那部分已经实现了,就是将 krb5-libs 写进 yum install 的包列表里,这样就会强制安装(升级)到最新的 krb5-libs