UNIX/Linux系统管理技术手册-读书笔记-第十七章
《UNIX/Linux系统管理技术手册-读书笔记-第十七章
单点登录
1. SSO概述
1.1 核心概念
| 概念 | 说明 | 能做什么 |
|---|---|---|
| 单点登录(SSO) | 用户使用一套凭证登录所有系统 | 提升用户体验,简化账户管理 |
| 身份(Identity) | 个体的抽象表述(用户名、UID、邮箱等) | 唯一标识用户 |
| 认证(Authentication) | 证明个体是某个身份的合法所有者 | 验证“你是谁” |
1.2 SSO的4个核心要素
| 要素 | 说明 | 常见实现 |
|---|---|---|
| 1. 集中式目录存储 | 保存用户身份和认证信息的中央数据库 | LDAP、Microsoft Active Directory |
| 2. 用户管理工具 | 管理目录条目(增删改查) | phpLDAPadmin、Apache Directory Studio、AD MMC |
| 3. 认证机制 | 验证用户身份的方法 | Kerberos(基于票据)、LDAP直接认证 |
| 4. 系统集成层 | 将目录服务与OS认证流程对接 | sssd(System Security Services Daemon)+ PAM + nsswitch.conf |
关键依赖:Kerberos环境需要 NTP(时间同步)和DNS(名称解析) 正常工作,因为认证票据带有时间戳且有效期有限。
2. LDAP:轻量级目录服务
2.1 LDAP是什么
| 概念 | 说明 | 能做什么 |
|---|---|---|
| LDAP | 基于属性的目录服务协议,专为“读多写少”场景优化 | 用户账户管理、认证、地址簿、应用配置分发 |
| 目录服务特点 | 数据对象小、广泛复制和缓存、基于属性、读多写少、搜索频繁 | 适合存储用户身份信息和组织架构 |
| LDIF | LDAP数据交换格式(文本格式) | 导入/导出LDAP数据,便于备份和迁移 |
2.2 LDAP数据结构
条目(Entry):LDAP的基本数据单元,由“专有名称(DN)”唯一标识。
DN(专有名称):类似文件系统路径,从右到左阅读(最高级在右)。
dn: uid=ghopper,ou=People,dc=navy,dc=mil
常见属性:
| 属性 | 含义 | 示例 |
|---|---|---|
dn |
专有名称(唯一标识) | uid=ghopper,ou=People,dc=navy,dc=mil |
dc |
域组件 | dc=navy,dc=mil |
ou |
组织单元 | ou=People |
cn |
通用名称 | cn=Grace Hopper |
uid |
用户ID | uid=ghopper |
objectClass |
对象类(定义条目结构) | objectClass: posixAccount |
对象类(ObjectClass):定义条目包含哪些属性,哪些是必需的,采用面向对象方式继承。
2.3 OpenLDAP vs 389 Directory Server
| 对比 | OpenLDAP | 389 Directory Server |
|---|---|---|
| 历史 | 密歇根大学成果的延续 | 同样源自密歇根大学,但经过商业(Netscape)打磨 |
| 文档 | 较简略(“轻快活泼”) | 专业级文档,多份管理和使用指南 |
| 复制 | 主从复制 | 多主复制(容错+写入性能) |
| 管理界面 | 命令行为主 | 图形控制台可用 |
| ActiveDirectory同步 | 需额外配置 | 原生支持 |
| 推荐场景 | 简单环境、已有经验 | 全新部署优先推荐 |
OpenLDAP配置文件(/etc/openldap/slapd.conf):
database bdb
suffix "dc=mydomain,dc=com"
rootdn "cn=admin,dc=mydomain,dc=com"
rootpw {crypt}abJnggxhb/YwI # 使用slappasswd生成
directory /var/lib/ldap
2.4 LDAP查询(ldapsearch)
| 选项 | 含义 |
|---|---|
-h |
LDAP服务器主机名 |
-p |
端口(389=LDAP,636=LDAPS) |
-x |
简单认证(非SASL) |
-D |
认证用户的DN |
-W |
提示输入密码 |
-b |
搜索起点(base DN) |
filter |
搜索条件(如cn=ned*) |
2.5 将passwd/group迁移到LDAP
- 参考RFC2307(将UNIX用户/组映射到LDAP的标准)
- 使用Padl Software的Perl脚本(
migrate_passwd、migrate_group)将平面文件转换为LDIF格式
3. 使用目录服务登录(SSO完整链路)
3.1 整体流程
用户 → PAM → sssd → LDAP/Kerberos → 目录服务
↓
nsswitch.conf ← sssd ← 用户信息
配置步骤:
- 配置Kerberos(可选,ActiveDirectory环境推荐)
- 配置sssd(连接LDAP/AD)
- 配置nsswitch.conf(使用sssd作为用户/组信息来源)
- 配置PAM(使用sssd处理认证)
3.2 Kerberos(基于票据的认证)
| 概念 | 说明 |
|---|---|
| KDC(密钥分发中心) | Kerberos认证的核心服务器 |
| TGT(票据授予票据) | 初次登录后获得的“主票据”,可用来换取其他服务的票据 |
| ActiveDirectory | 内置Kerberos KDC,是Windows域的认证基础 |
Linux加入AD域(realmd) :
FreeBSD手动配置Kerberos(/etc/krb5.conf):
[libdefaults]
default_realm = ULSAH
clockskew = 300
[realms]
ULSAH.COM = {
kdc = dc.ulsh.com
admin_server = dc.ulsh.com
}
[domain_realm]
.ulsh.com = ULSAH
ulsh.com = ULSAH
|
|
3.3 sssd(系统安全服务守护进程)
| 特性 | 说明 |
|---|---|
| 功能 | 一站式用户身份整理、认证、账户映射 |
| 支持源 | LDAP、ActiveDirectory、Kerberos |
| 额外能力 | 脱机缓存凭证(适用于移动设备) |
| 配置文件 | /etc/sssd/sssd.conf(权限必须为600) |
ActiveDirectory环境配置(最简单):
[sssd]
services = nss,pam
domains = ULSAH.COM
[domain/ULSAH.COM]
id_provider = ad
access_provider = ad
非AD的LDAP环境配置:
[sssd]
services = nss,pam
domains = LDAP
[domain/LDAP]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://ldap.ulsah.com
ldap_user_search_base = dc=ulsah,dc=com
tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
安全要求:sssd不允许在未加密信道上认证,必须使用LDAPS/TLS。
3.4 nsswitch.conf(名称服务切换)
配置(/etc/nsswitch.conf):
passwd: files sss
group: files sss
shadow: files sss
files:先查本地/etc/passwd等文件sss:再查sssd(→ LDAP/AD)
测试:
|
|
3.5 PAM(可插入式认证模块)
| 概念 | 说明 |
|---|---|
| PAM | 将认证逻辑从应用程序(login/sshd等)中分离到共享库 |
| 模块类型 | auth(认证)、account(账户有效性)、session(会话管理)、password(密码修改) |
| 控制标志 | required、requisite、sufficient、optional |
PAM配置行格式:
module-type control-flag module-path [arguments]
控制标志对比:
| 标志 | 失败时 | 成功时 | 说明 |
|---|---|---|---|
required |
最终失败,但继续执行 | 继续 | 最常用 |
requisite |
立即中止 | 继续 | 严格依赖 |
sufficient |
继续 | 立即中止(如成功) | 用于备选认证 |
optional |
不关心 | 不关心 | 仅当唯一模块时生效 |
sssd+PAM示例(/etc/pam.d/login关键行):
auth requisite pam_nologin.so
auth required pam_env.so
auth sufficient pam_unix.so
auth sufficient pam_sss.so use_first_pass
account required pam_unix.so
account [default=bad success=ok] pam_sss.so
password requisite pam_pwcheck.so nullok cracklib
password required pam_unix.so
password sufficient pam_sss.so
session required pam_limits.so
session required pam_lastlog.so nowtmp
模块顺序很重要:提示密码的模块必须在验证密码的模块之前。
4. 替代方案(不推荐新部署)
4.1 NIS(网络信息服务)
| 对比 | NIS | LDAP |
|---|---|---|
| 年代 | 20世纪80年代(Sun公司) | 20世纪90年代后主流 |
| 安全性 | 弱(无加密) | 强(TLS/SSL) |
| 可扩展性 | 有限 | 好 |
| 当前状态 | 仍受支持,但不应在新部署中使用 | 标准选择 |
4.2 rsync(应急文件分发)
- 优点:易于设置,可通过cron自动化
- 缺点:需配置无密码SSH(安全风险),适合小型环境应急使用
- 推荐替代:配置管理工具(Ansible、Puppet等)
5. 本章核心命令速查表
| 命令/文件 | 功能 |
|---|---|
ldapsearch -h server -b "dc=..." "uid=..." |
查询LDAP条目 |
slappasswd |
生成OpenLDAP管理员密码哈希 |
kinit user@REALM |
获取Kerberos票据 |
klist |
查看Kerberos票据 |
kdestroy |
销毁Kerberos票据 |
realm join --user=admin DOMAIN |
Linux加入AD域(realmd) |
adcli join -U user |
FreeBSD加入AD域 |
realm list |
查看域加入状态 |
getent passwd |
查看所有用户(含域用户) |
getent group |
查看所有组(含域组) |
systemctl status sssd |
检查sssd状态 |
/etc/sssd/sssd.conf |
sssd配置文件(权限600) |
/etc/nsswitch.conf |
名称服务切换配置 |
/etc/pam.d/ |
PAM模块配置目录 |
/etc/krb5.conf |
Kerberos客户端配置 |
/etc/openldap/slapd.conf |
OpenLDAP服务器配置 |
DBA视角补充:
- 数据库与LDAP/AD集成:MySQL、PostgreSQL、Oracle等主流数据库均支持LDAP/AD认证(如MySQL的
pam或ldap插件,PostgreSQL的ldap认证方法)。配置后,DBA无需在数据库中单独维护用户密码,统一使用企业目录服务。- 数据库用户映射:LDAP中的
posixAccount属性(UID/GID)可映射到数据库角色(Role)。例如,PostgreSQL的auth_ident可结合map文件将操作系统用户映射为数据库角色。- Kerberos与数据库:PostgreSQL和Oracle都支持Kerberos认证(通过
krb5.conf配置),适合已部署AD/Kerberos的企业环境。- sssd脱机缓存:在数据库服务器网络不稳定时,sssd的脱机缓存可防止认证中断导致数据库连接失败,但缓存策略需与安全策略平衡。
- PAM与数据库:若使用PAM认证数据库用户(如MySQL
auth_pam插件),需注意PAM模块栈配置,避免误将数据库认证和系统登录认证混淆。- 迁移注意事项:从本地
/etc/passwd迁移到LDAP时,务必保留本地系统账户(root、mysql、postgres等)在/etc/passwd中,避免系统启动时因依赖账户(如数据库服务账户)解析失败而无法启动数据库服务。
文章作者 会写代码的小郎中
上次更新 2011-06-28
许可协议 CC BY-NC-ND 4.0