《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)

1
2
3
4
5
# 查询cn以"ned"开头的所有用户
ldapsearch -h atrust.com -p 389 -x \
    -D "cn=trent,cn=users,dc=boulder,dc=atrust,dc=com" -W \
    -b "cn=users,dc=boulder,dc=atrust,dc=com" \
    "cn=ned*"
选项 含义
-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_passwdmigrate_group)将平面文件转换为LDIF格式

3. 使用目录服务登录(SSO完整链路)

3.1 整体流程

用户 → PAM → sssd → LDAP/Kerberos → 目录服务
                     ↓
               nsswitch.conf ← sssd ← 用户信息

配置步骤

  1. 配置Kerberos(可选,ActiveDirectory环境推荐)
  2. 配置sssd(连接LDAP/AD)
  3. 配置nsswitch.conf(使用sssd作为用户/组信息来源)
  4. 配置PAM(使用sssd处理认证)

3.2 Kerberos(基于票据的认证)

概念 说明
KDC(密钥分发中心) Kerberos认证的核心服务器
TGT(票据授予票据) 初次登录后获得的“主票据”,可用来换取其他服务的票据
ActiveDirectory 内置Kerberos KDC,是Windows域的认证基础

Linux加入AD域(realmd)

1
2
3
# 前提:安装realmd + sssd + NTP运行
realm join --user=trent ULSAH
realm list   # 验证

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
1
2
3
4
kinit [email protected]   # 获取票据
klist                           # 查看票据
kdestroy                        # 销毁票据
adcli join -U trent             # 加入AD域(FreeBSD)

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)

测试

1
getent passwd   # 列出所有用户(本地+域)

3.5 PAM(可插入式认证模块)

概念 说明
PAM 将认证逻辑从应用程序(login/sshd等)中分离到共享库
模块类型 auth(认证)、account(账户有效性)、session(会话管理)、password(密码修改)
控制标志 requiredrequisitesufficientoptional

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(应急文件分发)

1
2
# 从主服务器分发passwd/shadow到其他机器
rsync -gopt -e ssh /etc/passwd /etc/shadow lollipop:/etc
  • 优点:易于设置,可通过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的pamldap插件,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,避免系统启动时因依赖账户(如数据库服务账户)解析失败而无法启动数据库服务。