【2022争霸赛*干货满满】Linux7桌面使用SSSD通过LDAP认证域用户
  

maoxingwei 37521人觉得有帮助

{{ttag.title}}
本帖最后由 maoxingwei 于 2022-10-19 09:14 编辑

一,背景需求


我们在交付云桌面的时候,经常遇到客户使用Linux桌面的场景,一般场景中,普通交付的桌面无任何问题。遇到特殊需求的客户,需要特殊处理,如我今天分享的教程,客户需要对所有的Linux权限进行统一管控,权限精细化分配,所有云桌面用户必须是域控用户,域用户才能登录Linux桌面,只能使用分配的权限,这对于一些研发场景有非常重要的意义

二,技术原理

Linux桌面使用域用户登录,我经常做的是通过winbind 加域模式和pbis 加域模式,这两种模式都需要对模板虚拟机进行加域操作,对于后续维护桌面的运维工作,带来了不便利性。所以我在后续的项目中尝试了sssd (System Security Services Daemon, SSSD),它是基于一种轻量级的目录访问协议LDAP来做域用户的验证,它的原理很简单,使用Linux系统内置的系统安全服务守护进程 (System Security Services Daemon, SSSD)通过LDAP和域控通信。通过只读方式,读取域用户,来实现Linux桌面用户的管理和登录,且虚拟机不用加域,只需要虚拟机和域控通过ldap协议通信即可,易维护。如果对安全系数要求较高,还可以建立只读普通域用户,授权对特定的OU为只读模式,但是前期配置步骤稍微有点多,此文主要以如何让Linux7和域控通过ldap协议通信,并且实现Linux下常用的sudo权限。

三,准备工作

软件版本:Centos7.6
域名:lzuvdi.local
域控制器:ad.lzuvdi.local
虚拟机须禁用ipv6,禁用virbr0,禁用NMtool,并配置默认搜索域和DNS

四,配置过程

A,准备CA证书

1,导出CA证书
打开证书颁发机构,右键选择域证书,点击所有任务,单击备份CA,下一步


勾选私钥和CA证书和证书数据库和证书数据库日志,选择保存位置,下一步


密码选项留空,设置密码也可以,但是必须要记住,后面要用到。下一步,单击完成备份。


2,安装SSSD和LDAP组件

  1. yum install -y sssd nss-pam-ldapd sssd-ad sssd-tools
复制代码


3,生成所需文件和目录,注意域名更换为自己的

  1. authconfig --enablesssd --enablesssdauth --enableldap --enableldapauth --disableforcelegacy --enableldaptls --disablekrb5 --ldapserver ldap://ad.lzuvdi.local --ldapbasedn "dc=lzuvdi,dc=local" --enablemkhomedir --update
复制代码

然后

  1. systemctl restart sssd
复制代码

4,把第1步备份的CA证书上传到/etc/openldap/cacerts


5,转换证书为LDAP可识别的证书格式

  1. openssl pkcs12 -in lzuvdi-AD-CA.p12 -out ad.pem
复制代码

第一次提示输入备份时设置的密码,我备份CA时密码为空,则这里也留空。第二次提示设置一个PEM证书的密码,输入即可。


B,配置LDAPS

1,打开ldp.exe


2,点击左上角连接,单击连接,端口输入636,勾选SSL,单击确定。


此时左上角的链接已变为ldaps

3,点击左上角连接,单击绑定,勾选作为当前已登录用户绑定,单击确定。


4,点击浏览-搜索,在DN一栏输入域控DC和OU信息,进行查询,如我建立的VDI_Users


5,正常查询到我建立的65个用户


此时,说明LDAPS正常工作

C,配置SSSD

1,修改sssd配置文件参数,注意替换相关参数

  1. cat > /etc/sssd/sssd.conf << "EOF"
  2. [domain/lzuvdi.local]
  3. ldap_schema = ad
  4. cache_credentials = True
  5. ldap_search_base = dc=lzuvdi,dc=local
  6. id_provider = ldap
  7. auth_provider = ldap
  8. chpass_provider = ldap
  9. sudo_provider = ldap
  10. ldap_uri = ldap://ad.lzuvdi.local
  11. ldap_tls_reqcert = allow
  12. ldap_id_use_start_tls = True
  13. ldap_tls_cacertdir = /etc/openldap/cacerts
  14. #general
  15. debug_level = 7
  16. enumerate = false
  17. cache_credentials = true
  18. min_id = 7
  19. #ldap
  20. ldap_default_bind_dn = cn=administrator,cn=Users,dc=lzuvdi,dc=local
  21. ldap_user_search_base = ou=VDI_Users,dc=lzuvdi,dc=local
  22. ldap_sudo_search_base = OU=sudorules,DC=lzuvdi,DC=local
  23. #ldap provider
  24. full_name_format = %1$s
  25. fallback_homedir = /home/%u
  26. default_shell = /bin/bash
  27. ldap_id_mapping = True
  28. [sssd]
  29. services = nss,pam,sudo
  30. config_file_version = 2
  31. domains = lzuvdi.local
  32. [nss]
  33. [pam]
  34. [sudo]
  35. [autofs]
  36. [ssh]
  37. [pac]
  38. [ifp]
  39. [secrets]
  40. [session_recording]
  41. EOF
复制代码

继续输入

  1. sss_obfuscate --domain lzuvdi.local
复制代码

这里是为了加密sssd配置文件中用来绑定的和域控制器通信的管理员的密码,不让密码明文保存。我的配置参数中绑定的是超级管理员,则我在这里输入域控管理员administrator的密码,这一步是为了让域控的密码加密保存。


重启sssd

  1. systemctl restart sssd
复制代码

2,测试ldaps

  1. id user01
  2. id user10
  3. id user60
复制代码

都可以正常查询


3,测试创建/home目录

  1. su user02
  2. su user20
复制代码

自动创建home目录正常,并且默认shell 正常


D,配置sudo权限

配置之前先测试下sudo权限,提示用户user30不允许执行sudo命令


1,修改/etc/nsswitch.conf

  1. cat >> /etc/nsswitch.conf << "EOF"
  2. sudoers:   files  sss
  3. EOF
复制代码

2,进入/usr/share/doc/sudo-1.8.23文件夹,不同的版本,sudo后面的版本不同。


复制schema.ActiveDirectory文件到域控制器。

3,在域控执行下面的命令,注意替换关键参数

  1. ldifde -i -f schema.ActiveDirectory -c dc=x dc=lzuvdi,dc=local
复制代码


4,打开ADSI编辑器


5,右键单击ADSI编辑器,点击连接到,名称自定义,链接点键入名称即可,按如下图填写,dc参数自行更换,确定



6,右键单击顶级容器,即DC=lzuvdi,DC=local,选择新建-对象,


7,选择类为organizationalUnit,即我们常用的OU(组织单位),下一步


8,输入这个组织单位的值,即名称,我这里输入sudorules,名称自定义,要记住


9,右键单击新建的sudorules,选择新建-对象


10,选择类为sudoRole,输入值为sudoers,下一步,直至完成。



至此,建立一个OU,值为sudorules,建立一个cn,值为sudoers。那么调用这个容器的参数值即为:cn=sudoers,ou=sudorules,dc=lzuvdi,dc=local

11,为组和用户添加权限

有两种情况。一种是某个组下所有用户使用所有权限,或者部分权限,另一种是特定的用户具有所有权限或者部分权限,先以第一种情况为例。

根据man sudoers.ldap查看手册后,得知,让某个组下的所有成员具有所有的命令权限参数如下

  1. dn: cn=%wheel,ou=SUDOers,dc=my-domain,dc=com
  2. objectClass: top
  3. objectClass: sudoRole
  4. cn: %wheel
  5. sudoUser: %wheel
  6. sudoHost: ALL
  7. sudoCommand: ALL
复制代码

上述参数里面的cn是域控制器下的组或者用户,不是第10步创建的cn,%wheel代表wheel这个组下所有成员。此时来套用一下,要让我建立的VDI_Group这个组下的所有用户具有所有的sudo权限除useradd外,参数如下

  1. dn: cn=%VDI_Group,ou=sudorules,dc=lzuvdi,dc=local
  2. objectClass: top
  3. objectClass: sudoRole
  4. cn: %VDI_Group
  5. sudoUser: %VDI_Group
  6. sudoHost: ALL
  7. sudoCommand: ALL
  8. sudoCommand:!/usr/sbin/useradd
复制代码

右键点击第10步新建的cn,单击属性,双击displayName,键入如下值,这里的值即为上述参数中第一行的dn,点击确定

  1. CN=%VDI_Group,OU=sudorules,DC=lzuvdi,DC=local
复制代码


双击sudoHost,输入ALL,点击添加,单击确定



双击sudoUser,输入%VDI_Group,点击添加,单击确定


双击sudoCommand,输入ALL,点击添加,输入!/usr/sbin/useradd,点击添加,单击确定


12,编辑/etc/sssd/sss.conf,修改第21行内容为如下,此为调用sudo规则的基准位置

  1. ldap_sudo_search_base = OU=sudorules,DC=lzuvdi,DC=local
复制代码

OU=sudorules是规则容器
修改完之后,重启sssd

  1. systemctl restart sssd
复制代码

查看sssd日志,过滤关键词sudo

  1. cat /var/log/sssd/sssd_lzuvdi.local.log |grep sudo
复制代码


来具体测试一下,具有除useradd的所有权限

如需要配置单个用户权限,也很简单,以user30为例

  1. dn: cn=user30,ou=sudorules,dc=lzuvdi,dc=local
  2. objectClass: top
  3. objectClass: sudoRole
  4. cn: user30
  5. sudoUser: user30
  6. sudoHost: ALL
  7. sudoCommand: ALL
  8. sudoCommand:!/usr/bin/ls
  9. sudoCommand:!/usr/bin/rm
  10. sudoCommand:!/usr/bin/mkdir
复制代码

配置过程跟上面配置组一样,配置完记得重启sssd。测试下user30的sudo权限


E,配置桌面

1,安装agent 程序,然后重启虚拟机

2,清理虚拟机内产生的各种测试信息包括/home下的用户文件夹,以及agent程序和安装虚拟机所用到的各种命令

  1. echo > ~/.bash_history
  2. history -c
复制代码

3,虚拟机关机,克隆为模板

4,派生桌面

5,登录测试

至此,使用SSSD通过LDAP认证域用户配置结束


14258634f4916e8d77.png (105.8 KB, 下载次数: 236)

14258634f4916e8d77.png

27242634f4941cc1d2.png (84.71 KB, 下载次数: 248)

27242634f4941cc1d2.png

打赏鼓励作者,期待更多好文!

打赏
4人已打赏

平凡的小网工 发表于 2022-11-17 10:51
  
楼主的文章图文并茂,清晰易懂,看完这波操作可以轻松上手了,如遇到问题再向楼主请教~
小鱼儿 发表于 2023-4-12 13:21
  

感谢楼主分享,学习一下
日出 发表于 2023-4-12 13:21
  

感谢楼主分享,学习一下
朱墩2 发表于 2023-4-12 13:21
  

感谢楼主分享,学习一下
唐三平 发表于 2023-4-12 13:21
  

感谢楼主分享,学习一下
小德 发表于 2023-4-12 13:26
  

感谢楼主分享,学习一下
小小胖 发表于 2023-4-12 13:26
  

感谢楼主分享,学习一下
梦境人生 发表于 2023-4-12 13:27
  

感谢楼主分享,学习一下
德德 发表于 2023-4-12 13:30
  

感谢楼主分享,学习一下
发表新帖
热门标签
全部标签>
技术盲盒
西北区每日一问
安全效果
每日一问
干货满满
【 社区to talk】
新版本体验
技术笔记
功能体验
产品连连看
技术咨询
GIF动图学习
标准化排查
2023技术争霸赛专题
每周精选
通用技术
信服课堂视频
秒懂零信任
安装部署配置
排障笔记本
自助服务平台操作指引
答题自测
原创分享
升级&主动服务
社区新周刊
POC测试案例
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
技术晨报
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
高手请过招
高频问题集锦
全能先锋系列
云化安全能力

本版版主

468
227
32

发帖

粉丝

关注

7
11
24

发帖

粉丝

关注

5
7
7

发帖

粉丝

关注

31
34
45

发帖

粉丝

关注

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人

runner

本周提问达人