本文所述方法仅在Ubuntu 18.04.1和Debian 9.4上测试过。
Domain Join
首先将主机名设为统一格式,不然之后AD的DNS注册会出问题。(如果你使用了cloud-init,主机名是不能直接修改的,请自行查找资料或卸载cloud-init。)
1 |
hostnamectl set-hostname your-hostname.domain.name |
/etc/hosts 文件也需要一起修改以防止鉴权出错:
1 2 |
127.0.0.1 your-hostname.domain.name your-hostname localhost ::1 your-hostname.domain.name your-hostname localhost ip6-localhost ip6-loopback |
然后安装依赖,并加入域:
1 2 |
apt-get install realmd sssd-tools sssd libnss-sss libpam-sss adcli samba-common-bin packagekit realm join --verbose -U domain_username domain.name |
注:
- realm 默认的错误提示很反人类,所以建议把 --verbose 开关打开
- 用户名那部分不需要 @domain.name
- 如果机器上已经装有PackageKit, realm 应该会自动安装其它依赖,但是可能装不全,所以建议用我的命令;如果机器上没装PackageKit,realm可能会崩溃
- Debian上安装sssd的时候可能报启动失败,可以忽略
自动建立新登录用户的家目录
用 pam-auth-update 工具,勾选Create home directory on login选项(可能没有这个选项,那么需要手动操作)。
或者你想要手动操作的话:
在 /etc/pam.d/common-session 末尾增加一行:
session optional pam_mkhomedir.so
DNS自动注册
在/etc/sssd/sssd.conf
的[domain/corp.contoso.com]
一节末尾加上:
1 2 3 4 |
dyndns_update = true dyndns_refresh_interval = 43200 dyndns_update_ptr = true dyndns_ttl = 3600 |
让OpenSSH支持Kerberos鉴权
/etc/ssh/sshd_config 需要修改以下项:
1 2 3 4 5 6 7 8 9 10 11 12 |
UseDNS yes # Kerberos options KerberosAuthentication yes KerberosOrLocalPasswd yes KerberosTicketCleanup yes # GSSAPI options GSSAPIAuthentication yes GSSAPICleanupCredentials yes AuthenticationMethods gssapi-with-mic publickey keyboard-interactive |
然后 systemctl restart sshd 生效。
Kerberos设置(如果你有/etc/krb5.conf
这个文件的话):
1 2 3 4 |
mv /etc/krb5.conf /tmp/krb5.conf cat /var/lib/sss/pubconf/krb5.include.d/localauth_plugin /tmp/krb5.conf > /etc/krb5.conf rm /tmp/krb5.conf systemctl restart sssd |
解释一下吧。Debian/Ubuntu/OpenSUSE下面OpenSSH不能自动支持Kerberos鉴权是由很多个原因共同导致的。
首先,Debian/Ubuntu打包sssd的时候没有默认启用 auth_to_local 设置(sssd上是用 sssd_krb5_localauth_plugin.so 插件实现的),这就导致了发生Kerberos鉴权时,本地krb5因为找不到本地用户对应的Kerberos用户而尝试去读取 $HOME/.k5login 和 $HOME/.k5user这两个文件来确定哪些Kerberos用户允许登录到本机的该用户。而这两个文件一般都找不到,因此登录就失败了。(换句话说,如果你不做上面的操作,而是在这两个文件之一中正确写入你的Kerberos用户名,也是可以正确登录的,但是只对当前用户有效。)
其次,RHEL/CentOS的OpenSSH服务器实现支持两个字段叫 GSSAPIEnablek5users 和 KerberosUseKuserok 可以在SSH服务器端禁用对这两个文件的检查,而其它发行版的OpenSSH服务器实现均无这两项设置,因此OpenSSH默认打开了对这两个文件的检查,从而触发了前一段所述的问题。
最后,Ubuntu自带的sssd-krb5 1.16.1-1ubuntu1还不支持 includedir 配置,因此我们无法默认在 /etc/krb5.conf 配置文件中加入这个localauth插件。所以在OpenSUSE上可以直接在 /etc/krb5.conf 顶端加上:
1 |
includedir /var/lib/sss/pubconf/krb5.include.d/ |
然后重启sssd即可生效。而对于Debian/Ubuntu,这一行会导致鉴权直接失败,因此我们只能暂时把所需的文件内容直接写进 /etc/krb5.conf 了。
给域管理组sudo权限
首先我们在AD里面建个组,比如叫 LinuxAdministrators ;我们需要获取到这个组的Linux名称:
1 2 |
$ getent group LinuxAdministrators@domain.name linuxadministrators@domain.name:*:640000000:user1,user2,... |
返回值的第一部分 [email protected] 就是我们要的Linux名称了。
然后我们修改一下sudo配置:
1 |
visudo |
在里面加入一行:
1 |
%[email protected] ALL=(ALL) NOPASSWD: ALL |
离开域
1 |
realm leave --verbose -U domain_username domain.name |