20、Samba 4 实现 Active Directory 认证与 Linux 高可用性机制

Samba 4 实现 Active Directory 认证与 Linux 高可用性机制

1. Samba 4 实现 Active Directory 认证

1.1 设置域控制器

首先,需要安装 Samba 域控制器软件包:

$ sudo dnf install samba-dc

为确保环境干净,可移除 Samba 和 Kerberos 守护进程的所有配置文件:

$ sudo rm -f /etc/samba/smb.conf
$ sudo rm -f /etc/krb5.conf

Samba 包含自动配置域控制器的命令,无需手动编写配置文件。该命令支持交互式和非交互式模式,也可通过命令行选项指定部分参数,其余参数交互式输入。例如,若在 VirtualBox VM 中运行客户端系统,可使用 --option="interfaces=vboxnet0" --option="bind interfaces only=yes" 让控制器仅监听 VM 网络接口,使用 --use-rfc2307 包含 UNIX 用户字段。

最重要的参数是领域名称(realm name),必须是大写的域名,这是 Kerberos 协议的要求,小写领域名称将被拒绝。这里使用 AD.EXAMPLE.COM

运行以下命令进行域控制器的配置:

$ sudo samba-tool domain provision --option="interfaces=vboxnet0" --option="bind interfaces only=yes" --use-rfc2307 --interactive
Realm:  AD.EXAMPLE.COM
Domain [AD]:  AD
Server Role (dc, member, standalone) [dc]:
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
DNS forwarder IP address (write 'none' to disable forwarding) [127.0.0.53]:  192.168.56.1
Administrator password:
Retype password:

配置完成后,需手动复制 Kerberos 配置文件到目标位置:

$ sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

最后,启动 Samba 服务:

$ sudo systemctl start samba

1.2 创建测试用户

为验证认证是否正常工作,创建一个名为 testuser 的用户:

$ sudo samba-tool user create testuser

使用以下命令查看该用户账户的 LDAP 字段:

$ samba-tool user show testuser
dn: CN=testuser,CN=Users,DC=ad,DC=example,DC=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: testuser
instanceType: 4
whenCreated: 20221207171435.0Z
uSNCreated: 4103
name: testuser
objectGUID: 773d2799-e08c-41fb-9768-675dd59edbbb
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
primaryGroupID: 513
objectSid: S-1-5-21-2070738055-845390856-828010526-1103
accountExpires: 9223372036854775807
sAMAccountName: testuser
sAMAccountType: 805306368
userPrincipalName: testuser@ad.example.com
objectCategory: 
CN=Person,CN=Schema,CN=Configuration,DC=ad,DC=example,DC=com
pwdLastSet: 133149068751598230
userAccountControl: 512
lastLogonTimestamp: 133149085286105320
lockoutTime: 0
whenChanged: 20221207180044.0Z
uSNChanged: 4111
logonCount: 0
distinguishedName: CN=testuser,CN=Users,DC=ad,DC=example,DC=com

1.3 设置客户端

域控制器配置完成后,可设置客户端机器对其进行用户认证。由于客户端使用 Fedora,默认可能已安装 SSSD 和 realmd。

使用 realm discover 命令验证控制器是否正常工作:

$ realm discover ad.example.com
ad.example.com
  type: kerberos
  realm-name: AD.EXAMPLE.COM
  domain-name: ad.example.com
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: oddjob
  required-package: oddjob-mkhomedir
  required-package: sssd
  required-package: adcli
  required-package: samba-common-tools

从输出可知,该机器尚未加入该域,还列出了加入域所需安装的软件包,若未安装,可使用 DNF 命令安装,如 sudo dnf install samba-common-tools

加入域很简单,运行以下命令:

$ sudo realm join ad.example.com
Password for Administrator:

加入域后,需重启 SSSD 以应用更改:

$ sudo systemctl restart sssd

生成的 SSSD 配置如下:

$ sudo cat /etc/sssd/sssd.conf
[sssd]
domains = ad.example.com
config_file_version = 2
services = nss, pam
[domain/ad.example.com]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = AD.EXAMPLE.COM
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = ad.example.com
use_fully_qualified_names = True
ldap_id_mapping = True
access_provider = ad

由于 SSSD 作为 NSS 提供者,可使用 id 命令查询 testuser 账户信息,但需指定其带域名的完全限定名称:

$ id testuser@ad.example.com
uid=1505601103(testuser@ad.example.com) gid=1505600513(domain users@ad.example.com) groups=1505600513(domain users@ad.example.com)

也可通过输入 testuser@ad.example.com 和之前在控制器上设置的密码登录控制台。

2. Linux 高可用性机制

2.1 冗余和负载均衡类型概述

现代 TCP/IP 网络栈是分层的,常见的分层模型有七层的开放系统互连(OSI)模型和四层的 DoD 模型,如下表所示:
| OSI 模型 | DoD 模型 | 目的 | 示例 |
| — | — | — | — |
| 物理 | 链路 | 传输代表比特流的电/光信号 | 以太网、Wi-Fi |
| 数据链路 | 网络 | 在分段、路由网络中传输数据包 | IPv4、IPv6 |
| 传输 | 传输 | 可靠传输数据段(完整性检查、确认、拥塞控制等) | TCP、UDP、SSTP |
| 会话 | 应用 | 传输特定应用的数据 | HTTP、SMTP、SSH |
| 表示 | 应用 | | |

为使网络能抵抗不同类型的故障,应在多个层面实现冗余。例如,用两根电缆将服务器连接到网络可防止单根电缆或网卡故障,但无法防止服务器软件故障。可通过设置多个服务器并引入专用负载均衡节点来解决此问题,负载均衡器可在传输层或应用层增加冗余,提高服务总容量。但负载均衡器本身可能成为单点故障,因此链路层和网络层的冗余尤为重要。

2.2 术语说明

描述冗余设置时,默认使用活动/备用(active/standby)术语,即一次只有一个活动节点工作,一个或多个备用节点在活动节点故障时接替工作。一些旧文献可能使用主/从(master/slave)术语,该术语因与奴隶制相关且易产生误解,正被许多项目逐步淘汰。

2.3 链路层冗余

在户外安装和工业网络中,电缆和以太网交换机端口故障较为常见,因此拥有多个链路层连接很有用。但简单地将 Linux 机器的两个不同网卡连接到同一交换机的不同端口并不能使它们作为一个连接工作,需要显式设置。

Linux 支持多种将多个网卡组合使用的方式,包括活动/备用和负载均衡配置,不同模式对交换机的要求不同,如下表所示:
| 类型 | 操作 | 交换机要求 |
| — | — | — |
| active-backup (1) | 一个网卡禁用,另一个启用 | 无;适用于任何交换机(包括非管理型交换机) |
| 802.3ad (4) | 帧在所有端口上平衡 | 需要 803.3ad LACP 支持 |
| balance-xor (2) 和 broadcast (3) | | 需要 EtherChannel 支持 |
| balance-tlb (5) 和 balance-alb (6) | | 无 |

最简单的模式是 active-backup ,无需在以太网交换机上进行特殊设置,甚至可与最简单、最便宜的非管理型交换机配合使用,但仅提供活动/备用冗余,不提供负载均衡。在使用 NetworkManager 配置的系统中,可使用以下命令将 eth0 eth1 网络接口合并为一个 bond0 接口:

$ sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
$ sudo nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname eth0 master bond0
$ sudo nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname eth1 master bond0
$ sudo nmcli connection up bond0

此配置可在 eth0 eth1 与交换机物理断开连接时保留链路层连接性,但会浪费带宽。高性能服务器应尽可能使用当前行业标准的 802.3ad LACP 协议连接到以太网网络,以利用多个链路的组合带宽并自动排除故障链路。

2.4 网络层冗余和负载均衡

若系统有多个独立的互联网或内部网络连接,可提供备份路由或在多个路由上平衡 IP 数据包。但实际上,网络层冗余主要由路由器使用,其最简单形式仅适用于具有公共、全球路由地址的网络。

假设 Linux 系统连接到两个不同的路由器,IPv4 地址分别为 192.0.2.1 和 203.0.113.1。若希望一个连接作为备用,可创建两个默认路由并为备用连接分配较高的度量值:

$ sudo ip route add 0.0.0.0/0 via 192.0.2.1 metric 200
$ sudo ip route add 0.0.0.0/0 via 203.0.113.1 metric 100

此方法的优点是与同一系统上的网络地址转换(NAT)兼容。若要创建负载均衡配置,由于网络层负载均衡是逐包进行的,不考虑连接概念,会出现更多问题。例如,简单的多路径路由配置如下:

$ sudo ip route add 0.0.0.0/0 nexthop via 192.0.2.1 weight 5 nexthop via 203.0.113.1 weight 10

但此配置与 NAT 不兼容,因为它会将属于同一 TCP 连接或 UDP 流的数据包发送到不同的网关。可使用基于策略的路由设置按连接进行负载均衡,但这超出了本文范围。

2.5 传输层负载均衡与 LVS

网络层机制的主要缺点是网络层处理单个数据包,没有连接概念。许多网络服务是面向连接的,因此同一连接的所有数据包必须始终发送到同一服务器。Linux 中的 NAT 实现虽能检测来自同一连接的数据包,但简单的一对多 NAT 负载均衡对许多用例来说过于简单。

为解决此问题,Linux 包含 LVS 框架和管理工具 ipvsadm 。LVS 框架的关键概念是虚拟服务器和真实服务器,虚拟服务器提供服务的公共地址,接受连接并将其分配到多个真实服务器,真实服务器可运行任何操作系统和软件,且无需知道虚拟服务器的存在。

LVS 提供多种负载调度算法,各有优缺点,如下表所示:
| 算法 | 描述 |
| — | — |
| 轮询(Round Robin,rr) | 平均分配连接到所有服务器 |
| 加权轮询(Weighted Round Robin,wrr) | 类似于轮询,但可通过为某些服务器分配更高权重值来发送更多连接 |
| 最少连接(Least Connection,lc) | 优先将新连接发送到当前连接数最少的服务器 |
| 加权最少连接(Weighted Least Connection,wlc) | 默认调度算法,类似于最少连接,但可为服务器分配权重 |
| 基于位置的最少连接(Locality-Based Least-Connection,lblc) | 将具有相同目标 IP 地址的新连接发送到同一服务器,若该服务器不可用或过载则切换到下一个服务器 |
| 带复制的基于位置的最少连接(Locality-Based Least-Connection with Replication,lblcr) | 若服务器未过载,将具有相同目标 IP 地址的新连接发送到同一服务器,否则发送到连接数最少的服务器 |
| 目标哈希(Destination Hashing,dh) | 创建将目标 IP 地址映射到服务器的哈希表 |
| 源哈希(Source Hashing,sh) | 创建将源 IP 地址映射到服务器的哈希表 |
| 最短预期延迟(Shortest Expected Delay,sed) | 将新连接发送到预期延迟最短的服务器 |
| 永不排队(Never Queue,nq) | 将新连接发送到第一个空闲服务器,若没有空闲服务器则切换到最短预期延迟算法 |

选择合适的调度算法取决于服务类型,没有一种算法对所有用例都是绝对最好的。例如,轮询和加权轮询最适合短连接服务,如提供静态页面或文件的 Web 服务器(如内容分发网络)。

2.6 使用 Keepalived 共享虚拟 IP 地址并自动化 LVS 配置

Keepalived 可用于在多个节点之间共享虚拟 IP 地址,并自动化 LVS 配置。其工作原理基于虚拟路由器冗余协议(VRRP),允许多个物理服务器共享一个虚拟 IP 地址,当活动服务器发生故障时,备用服务器可接管该虚拟 IP 地址,确保服务的连续性。

以下是使用 Keepalived 配置 LVS 的基本步骤:
1. 安装 Keepalived

$ sudo dnf install keepalived
  1. 配置 Keepalived
    编辑 /etc/keepalived/keepalived.conf 文件,示例配置如下:
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.101 80 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f8d06963a18ff9922b4b96
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.102 80 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f8d06963a18ff9922b4b96
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

在上述配置中:
- vrrp_instance 部分定义了 VRRP 实例,包括状态( state )、接口( interface )、虚拟路由器 ID( virtual_router_id )、优先级( priority )等。
- virtual_server 部分定义了虚拟服务器的 IP 地址和端口,以及使用的负载均衡算法( lb_algo )和转发模式( lb_kind )。
- real_server 部分定义了真实服务器的 IP 地址和端口,以及健康检查配置。
3. 启动 Keepalived 服务

$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived

2.7 应用层负载均衡解决方案 - HAProxy 示例

应用层负载均衡可根据应用层协议(如 HTTP、SMTP 等)的内容进行负载均衡决策,提供更细粒度的控制。HAProxy 是一个流行的应用层负载均衡器,可用于分发 HTTP、TCP 等流量。

以下是使用 HAProxy 进行负载均衡的基本步骤:
1. 安装 HAProxy

$ sudo dnf install haproxy
  1. 配置 HAProxy
    编辑 /etc/haproxy/haproxy.cfg 文件,示例配置如下:
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend http-in
    bind *:80
    default_backend servers

backend servers
    balance     roundrobin
    server  server1 192.168.1.101:80 check
    server  server2 192.168.1.102:80 check

在上述配置中:
- global 部分定义了全局参数,如日志、用户、最大连接数等。
- defaults 部分定义了默认参数,如模式、日志选项、超时时间等。
- frontend 部分定义了前端监听的 IP 地址和端口,以及默认的后端服务器组。
- backend 部分定义了后端服务器组,包括负载均衡算法( balance )和真实服务器的信息。
3. 启动 HAProxy 服务

$ sudo systemctl start haproxy
$ sudo systemctl enable haproxy

2.8 总结

通过 Samba 4 实现 Active Directory 认证,可在 Linux 系统上搭建与 Microsoft Active Directory 兼容的域控制器,并让其他 Linux 机器加入该域进行用户认证。而 Linux 的高可用性机制涵盖了链路层、网络层、传输层和应用层的冗余和负载均衡,可有效提高系统的可靠性和性能。

链路层冗余可通过网卡绑定等方式防止电缆和网卡故障;网络层冗余可提供备份路由或进行 IP 数据包的负载均衡;传输层负载均衡使用 LVS 框架可根据连接情况分配负载;应用层负载均衡如 HAProxy 可根据应用层协议内容进行更细粒度的负载均衡。

选择合适的冗余和负载均衡方案取决于具体的应用场景和需求,综合使用不同层面的技术可构建出高可用、高性能的网络系统。

以下是一个简单的高可用性系统架构 mermaid 流程图:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A(用户):::process --> B(负载均衡器):::process
    B --> C1(应用服务器 1):::process
    B --> C2(应用服务器 2):::process
    B --> C3(应用服务器 3):::process
    C1 --> D(数据库):::process
    C2 --> D
    C3 --> D
    E(Keepalived 主节点):::process --> B
    F(Keepalived 备用节点):::process --> B
    G(HAProxy):::process --> B

此流程图展示了一个典型的高可用性系统架构,包括用户、负载均衡器、多个应用服务器、数据库,以及 Keepalived 和 HAProxy 的作用。用户请求首先到达负载均衡器,负载均衡器将请求分配到不同的应用服务器,应用服务器访问数据库获取数据。Keepalived 用于确保负载均衡器的高可用性,HAProxy 作为应用层负载均衡器进一步优化负载分配。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值