内容


在 IBM PureApplication System 上集成操作系统身份验证和 Microsoft Active Directory

Comments

简介

在实现 IBM PureApplication System 时,IBM 推荐集成一个外部 LDAP 子系统。这支持将身份验证以及组成员相关工作卸载到 IT 范围内的一个现有企业目录上。它适用于 IBM PureApplication System 的管理接口的用户组,比如系统控制台、工作负载控制台、Pure CLI 和 REST 接口。

有了所描述的 LDAP 集成之后,需要描述的是在系统上的每个虚拟机中部署的操作系统不会自动与该 LDAP 集成。许多客户要求操作系统集成一个外部 LDAP,因为这会大大简化 PureApplication System 上的大量 VM 的安全管理。

本文将介绍如何将 IBM PureApplication System 上的操作系统安全性与 Microsoft Active Directory(许多客户使用的一个 LDAP 实现)相集成。这里详细介绍了如何使用脚本包,为虚拟系统模式下的 VM 自动化这一集成。要实现此集成,则需要在 Active Directory 中执行的设置,本文对此进行了重点介绍。

这里描述的解决方案仅适用于运行 Red Hat Enterprise Linux® 的 Intel® IBM PureApplication System 型号(8283/W1500 和 8283/W2500)。

问题

在部署一种虚拟系统模式时,管理员必须在部署时指定将在 Red Hat Enterprise Linux (RHEL) OS 中定义的一个或多个操作系统帐户的密码。帐户始终包含 rootvirtuser,但根据虚拟系统模式,可能还有其他帐户(比如针对 IBM DB2® 的 db2inst1)。

虚拟系统模式在 PureApplication System 上的部署方便了一个或多个虚拟机的部署。结果,管理大量 VM 变得越来越困难。管理员需要转交这些操作系统帐户的密码。管理这些帐户的生命周期可能很麻烦;例如,您如何执行一个要求密码每 3 个月更改一次的密码策略?其他挑战包括新成员加入管理员团队和其他人员离开。

考虑到这些困难性,集成 RHEL OS 与一个现有的 Microsoft Active Directory 服务会带来许多好处。密码的生命周期管理不再属于 PureApplication System 自身上的 VM 的责任范围。Active Directory 中存在的用户需要获得一种机制来登录到已部署的 VM。还需要配置 RHEL OS,以便在用户尝试通过 SSH 登录时,可以访问 Active Directory 来验证用户的凭据和组成员关系。组成员关系可用于将对一个 VM 的访问权限制到 Active Directory 中存在的一个用户子集。

实现

这个示例解决方案使用 Samba 对 Active Directory 执行身份验证。配置了可插拔身份验证模块 (PAM) 和 winbind,并将 RHEL 主机实际加入到 Active Directory 域中。加入域中需要 Active Directory 中的一个容器,以及一个具有在该域中创建计算机对象的足够权限的绑定用户。

在完成此操作后,操作系统就可以使用质询/响应模式向 Active Directory 执行身份验证。用户的组成员资格也可以从 Active Directory 获得,可以配置与 uid 和 gid 的一致的映射。因为 RHEL 主机加入了域中,所以它还可以获得 Kerberos 票证。这可在域中实现单点登录 (SSO),这是一个强大的特性。登录到一个 VM 后,用户可通过 SSH 连接到同一个域中的另一个 VM,而无需重新输入他的密码。

因为 Pure Application System 上的 VM 是可删除的,所以还需要删除 Active Directory 中相应的计算机对象。因此,这需要绑定用户拥有删除 Active Directory 中的计算机对象的足够权限(图 1)。

图 1. 解决方案概述
解决方案概述
解决方案概述

我们的目的是根据 Active Directory 中的用户的组成员关系来分配权限。对于系统上的每个工作负载,可以使用组成员关系来确定用户是否有权通过 SSH 登录,或者用户是否可以执行 switch user (su) 来切换为技术用户或根用户:

  • GRP_IPAS_<workload>_login
    此组的成员允许使用 SSH 登录到操作系统。
  • GRP_IPAS_<workload>_middleware
    此组的成员允许执行 switch user (su) 来切换到操作系统上的一个或多个不同的技术用户;例如 virtuser 或 db2inst1。
  • GRP_IPAS_<workload>_root
    此组的成员允许执行 switch user (su) 切换为根用户。

Active Directory 设置

以下各节将介绍 Active Directory 域中需要哪些设置。尝试在 RHEL 中配置操作系统安全和加入域之前,需要完成这些设置。

  • 容器

    为了简化此示例的 Active Directory 结构,将所有相关的组件放在 Active Directory 域的根目录下的一个容器中:

    OU=IPAS,DC=dw,DC=ibm,DC=com

    在这个容器内,为服务帐户、组和加入域中的实际主机创建了 3 个额外的容器:

    OU=Service Accounts,OU=Users,OU=IPAS, DC=dw,DC=ibm,DC=com
    OU=Management,OU=Groups,OU=IPAS, DC=dw,DC=ibm,DC=com
    OU=Servers,OU=IPAS, DC=dw,DC=ibm,DC=com

    图 2 演示了您需要拥有的结构。

    图 2. Active Directory 树设置
    Active Directory 树设置
  • 服务帐户

    需要 Active Directory 中的一个服务帐户,它要能在加入域中时创建新计算机对象。这个帐户需要在容器 OU=Servers,OU=IPAS,DC=dw,DC=ibm,DC=com 中创建新计算机对象的权限。离开域后,计算机对象需要从容器中删除。因此,该帐户还需要有权限从容器中删除计算机对象:

    CN=IPASAD,OU=Service Accounts,OU=Users,OU=IPAS,DC=dw, DC=ibm, DC=com

  • 组和用户

    在加入域中后,您将使用组成员关系来确定用户拥有该操作系统上的哪些权限。因此,需要创建一些组来实现此用途;当然,还可以不断添加更多的组:

    • GRP_IPAS_myWorkload_login
      此组的成员允许使用 SSH 登录到操作系统。
    • GRP_IPAS_myWorkload_middleware
      此组的成员允许执行 switch user (su) 来切换到操作系统上的一个或多个不同的技术用户;例如 virtuser 或 db2inst1。
    • GRP_IPAS_myWorkload_root
      此组的成员允许执行 switch user (su) 切换为根用户。

    自然地,还需要定义一些用户。出于测试用途,应该有一些具有不同组成员关系的用户。

  • 需要的 RPM

    需要提供以下 RPM 文件,才能执行与 Active Directory 的集成。请注意,版本很重要;我们发现在旧版的 Samba/winbind 二进制程序中,组成员具有不一致的行为。这里列出的 RPM 版本已经过测试,应被视为最低版本编号。

    这些 RPM 需要在配置 RHEL OS 之前安装。根据您的虚拟系统模式所使用的虚拟镜像,一些 RPM 可能已经安装:

    • libsmbclient-3.6.9-151.el6.x86_64.rpm
    • libtalloc-2.0.7-2.el6.x86_64.rpm
    • libtdb-1.2.10-1.el6.x86_64.rpm
    • openldap-clients-2.4.23-20.el6.x86_64.rpm *
    • openldap-clients-2.4.23-26.el6_3.2.x86_64.rpm *
    • openldap-clients-2.4.23-32.el6_4.1.x86_64.rpm *
    • openldap-clients-2.4.23-34.el6_5.1.x86_64.rpm *
    • samba-3.6.9-151.el6.x86_64.rpm *
    • samba-3.6.9-151.el6_4.1.x86_64.rpm *
    • samba-3.6.9-169.el6_5.x86_64.rpm *
    • samba-client-3.6.9-151.el6.x86_64.rpm
    • samba-common-3.6.9-151.el6.x86_64.rpm
    • samba-winbind-3.6.9-151.el6.x86_64.rpm
    • samba-winbind-clients-3.6.9-151.el6.x86_64.rpm

    对于此列表中标有 * 的包,要使用的准确版本取决于虚拟镜像。

  • 需要的数据

    这是您在执行脚本时需要变量形式提供的数据(定义如下):

    $ADS_username
    $ADS_password
    $ADS_container_shortname
    $ADS_domain
    $ADS_workgroup
    $ADS_realm
    $ADS_login_group
    $ADS_middleware_group
    $ADS_root_group

    • 服务帐户用户名和密码:要创建(和删除)计算机对象,需要使用之前在 Active Directory 中定义的服务帐户的用户名和密码。
    • 容器名称:net ads join 命令需要存储计算机对象的容器名称 (OU)。OU 字符串自顶向下读取,没有相对区分名 (RDN),而且使用 “/” 分隔。在此示例中,您的容器 OU=Servers,OU=IPAS, DC=dw,DC=ibm,DC=com 应命名为 “IPAS/Servers”。
    • 域:需要虚拟机的域,尤其是对于 net ads join 命令。由于 Pure Application System 在部署时提供了限定的主机名,您将使用 hostname –domain 命令来获取域名称,所以不需要将它公开为脚本包变量。
    • 工作组:Samba 将使用要加入的工作组的名称。在下面的代码示例中,该数据被存储在 $ADS_workgroup 变量中。
    • 范围:Samba 和 Kerberos 身份验证使用的范围名称。它还会在加入 Active Directory 时用于创建 UPN(用户主体名称)。在下面的代码示例中,此数据存储在 $ADS_realm 变量中。
    • 组名称:设置正确的权限需要 3 个组的名称:
      • GRP_IPAS_myWorkload_login
      • GRP_IPAS_myWorkload_middleware
      • GRP_IPAS_myWorkload_root。

配置 RHEL 6 OS

以下各节将介绍通过在 RHEL 6 中配置安全性与 Active Directory 进行集成所需的步骤。

1. 识别配置文件路径

这里您将使用配置文件的默认文件路径。要使用的文件包括:

  • /etc/samba/smb.conf
  • /etc/security/pam_winbind.conf
  • /etc/security/access.conf
  • /etc/krb5.conf
  • /etc/sudoers。

2. 启动服务

安装所有需要的 RPM 后,第一步是确保服务 messagebusoddjobdsmbwinbind 都已启动。

3. 设置初始 samba 配置

将文件 /etc/samba/smb.conf 的内容替换为清单 1 中所示的代码。替换该文件的内容之前,保留它的一个备份副本。

清单 1.
     [global]
     idmap config ${HomeDirDomain} : backend=rid
     idmap config ${HomeDirDomain} : range=100000-2000000000
     winbind enum users = false
     winbind enum groups = false
     # http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html#KERBEROSMETHOD
     kerberos method = secrets and keytab
     client ldap sasl wrapping = sign
     username level = 3
     server string = Samba Server Version %v
     log file = /var/log/samba/log.%m
     max log size = 50
     passdb backend = tdbsam

请注意,必须将 ${HomeDirDomain} 字符串替换为域的短名称,该名称可使用以下命令获得:

HomeDirDomain=$(echo $ADS_domain | awk -F'.''{print $1}' | tr '[:lower:]' '[:upper:]')

还要确保 /var/log/samba 目录存在,否则不会记录任何信息。

4. 修改配置文件

运行 authconfig 实用程序来修改配置文件(清单 2)。

清单 2.
     authconfig \
     --disablecache \
     --enablewinbind \
     --enablewinbindauth \
     --smbsecurity=ads \	
     --smbworkgroup=$ADS_workgroup \
     --smbrealm=$ADS_realm \
     --enablewinbindusedefaultdomain \
     --winbindtemplateshell=/bin/bash \
     --winbindtemplatehomedir=/home/${HomeDirDomain}/%U \
     --krb5realm=$ADS_realm \
     --enablekrb5kdcdns \
     --enablekrb5realmdns \
     --smbidmapuid=100000-2000000000 \
     --smbidmapgid=100000-2000000000 \
     --enablelocauthorize \
     --enablepamaccess \
     --enablemkhomedir \
     --disablefingerprint \
     --disablesmartcard \
     --updateall

添加了选项 --winbindtemplatehomedir=/home/${HomeDirDomain}/%U,以便在一个用户首次登录到系统时,将创建一个主目录 /home/<domain>/<user>

运行此命令后,生成的 samba 配置应类似于清单 3。(请记住,工作组和范围值仅是作为示例的示例值。)

清单 3.
     [global]
     #--authconfig--start-line--
     
     # Generated by authconfig on 2014/01/15 18:15:56
     # DO NOT EDIT THIS SECTION (delimited by --start-line--/--end-line--)
     # Any modification may be deleted or altered by authconfig in future
     
     workgroup = DW
     realm = DW.IBM.COM
     security = ads
     idmap uid = 100000-2000000000
     idmap gid = 100000-2000000000
     template shell = /bin/bash
     winbind use default domain = true
     winbind offline logon = false
     
     #--authconfig--end-line--
     idmap config DW : backend=rid
     idmap config DW : range=100000-2000000000
     winbind enum users = false
     winbind enum groups = false
     # http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html#KERBEROSMETHOD
     kerberos method = secrets and keytab
     client ldap sasl wrapping = sign
     username level = 3
     server string = Samba Server Version %v
     log file = /var/log/samba/log.%m
     max log size = 50
     passdb backend = tdbsam

还会生成 PAM 配置,生成文件 /etc/pam.d/system-auth-ac/etc/pam.d/password-auth-ac(清单 4)。

清单 4.
     #%PAM-1.0
     # This file is auto-generated.
     # User changes will be destroyed the next time authconfig is run.
     auth        required      pam_env.so
     auth        sufficient    pam_unix.so nullok try_first_pass
     auth        requisite     pam_succeed_if.so uid >= 500 quiet
     auth        sufficient    pam_winbind.so use_first_pass
     auth        required      pam_deny.so
     
     account     required      pam_access.so
     account     required      pam_unix.so broken_shadow
     account     sufficient    pam_localuser.so
     account     sufficient    pam_succeed_if.so uid < 500 quiet
     account     [default=bad success=ok user_unknown=ignore] pam_winbind.so
     account     required      pam_permit.so
     
     password    requisite     pam_cracklib.so try_first_pass retry=3 type=
     password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
     password    sufficient    pam_winbind.so use_authtok
     password    required      pam_deny.so
     
     session     optional      pam_keyinit.so revoke
     session     required      pam_limits.so
     session     optional      pam_oddjob_mkhomedir.so
     session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
     session     required      pam_unix.so

5. 修改 Kerberos 配置

必须修改 /etc/krb5.conf 文件,以便:

  • 删除对 EXAMPLE.COM 的引用。
  • 添加默认加密类型。
  • 将 default_realm 条目添加到 libdefaults 节中。
  • 将 realm 条目添加到 realm 部分。
  • 添加 domain_realm 部分的条目。

这可以使用清单 5 中的代码来完成。

清单 5.
     # creating backup of original config file 
     cp $ADS_kerberos_config_file $ADS_kerberos_config_file.bk
     
     # remove "EXAMPLE.COM" samples entries from config file
     #cat $ADS_kerberos_config_file.bk | sed '/EXAMPLE.COM.*{.*}/d'| 
     sed '/EXAMPLE.COM.*{/,/}/d' | grep -v EXAMPLE.COM > $ADS_kerberos_config_file
     cat $ADS_kerberos_config_file.bk |grep -vi EXAMPLE |grep -v } > 
     $ADS_kerberos_config_file
     
     # configure use of arcfour-hmac-md5 and aes256-cts-hmac-sha1-96 as defaults for 
     kerberos tickets in kerberos configuration file (this is required when ADS is running 
     on Windows 2008R2 server!)
     sed -i "s/^\[libdefaults\]/\[libdefaults\]\n default_tkt_enctypes = arcfour-hmac-md5 
     aes256-cts-hmac-sha1-96\n default_tgs_enctypes = arcfour-hmac-md5 aes256-cts-hmac-sha1-96/" 
     $ADS_kerberos_config_file
     
     # add default_realm entries to libdefaults section
     sed -i "s/^\[libdefaults\]/\[libdefaults\]\n default_realm = $ADS_realm/" 
     $ADS_kerberos_config_file
     
     # add realm entries to realm section
     sed -i "s/^\[realms\]/\[realms\]\n $ADS_realm = {\n  } /" $ADS_kerberos_config_file
     
     # add entries for the domain of the actual host to kerberos configuration file to ensure 
     that they are part of the realm 
     sed -i "s/^\[domain_realm\]/\[domain_realm\]\n `hostname -d` = $ADS_realm\n .`hostname -d` 
     = $ADS_realm/" $ADS_kerberos_config_file

修改后的 /etc/krb5.conf 文件现在应该类似于清单 6。

清单 6.
     [logging]
     default = FILE:/var/log/krb5libs.log
     kdc = FILE:/var/log/krb5kdc.log
     admin_server = FILE:/var/log/kadmind.log
     
     [libdefaults]
     default_tkt_enctypes = arcfour-hmac-md5 aes256-cts-hmac-sha1-96
     default_tgs_enctypes = arcfour-hmac-md5 aes256-cts-hmac-sha1-96
     default_realm = DW.IBM.COM
     dns_lookup_realm = true
     dns_lookup_kdc = true
     ticket_lifetime = 24h
     renew_lifetime = 7d
     forwardable = true
     
     [realms]
     
     DW.IBM.COM = {
     }
     
     [domain_realm]
     dw.ibm.com = DW.IBM.COM
     .dw.ibm.com = DW.IBM.COM

6. 加入 Active Directory 域

接下来,将让该机器加入 Active Directory 域中。这可以使用 net ads join 命令来实现。更准确地讲,您将运行清单 7 中所示的命令。

清单 7.
     net ads join -w $ADS_workgroup -U $ADS_username%$ADS_password 
     createupn=host/`hostname -f`@$ADS_realm createComputer=$ADS_container_shortname 
     2> /dev/null | grep -v "DNS Update"
     
     if [[ `net ads testjoin` == "Join is OK" ]]; then
     logger_info "join_ads_domain: Successfully joined domain!"
     else
     logger_error "join_ads_domain: Failed to join domain!"
     fi

此命令中传递的变量包括:

  • $ADS_workgroup
    域中的工作组的名称。
  • $ADS_username
    Active Directory 服务帐户的用户名。
  • $ADS_password
    Active Directory 服务帐户的密码。
  • $ADS_realm
    域的范围(例如 DW.IBM.COM)。
  • $ADS_container_shortname
    将在其中将主机注册为计算机对象的容器的短名称(例如,如果它的区分名为 OU=Servers,OU=IPAS, DC=dw,DC=ibm,DC=com,则短名称为 “IPAS/Servers”)。

请注意,这里绝不会使用实际的 Active Directory 服务器的主机名。相反,/etc/krb5.conf 中的以下两行可以确保 Active Directory 域控制器能够通过 DNS 找到:

dns_lookup_realm = true
dns_lookup_kdc = true

加入域(也就是运行 net ads join 命令)后,Kerberos 将从 DNS 记录中获取 Active Directory 域控制器。这里的域控制器将充当着 Kerberos 身份验证服务器和密钥分发中心 (KDC)。请注意,DNS 记录的类型为 type=SRV,名称需要采用 _kerberos._tcp.<domain> 格式。在这里,<domain> 是主机的域(由命令 hostname –d 报告)。对一个域使用多个域控制器时,每个控制器应在 DNS 中有一条记录。

这里介绍的解决方案要求域控制器的这些记录存在于 DNS 中。

清单 8 显示了一个如何使用 DNS 查找这些记录的例子。在本例中,域 test.dw.ibm.com 总共有 7 个域控制器。

清单 8.
     nslookup -type=SRV _kerberos._tcp.test.dw.ibm.com 
     
     ;; Truncated, retrying in TCP mode.
     Server:         10.16.81.21
     Address:        10.16.81.21#53
     
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw238vdcw9re.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw244vdcw9rb.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw243vdcw9rb.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw242vdcw9re.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw376vdcw9rb.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw239vdcw9rb.test.dw.ibm.com.
     _kerberos._tcp.test.dw.ibm.com   service = 0 100 88 dw286vdcw9re.test.dw.ibm.com.

在将服务器成功加入域后,可以使用清单 9 中所示的命令获取更多的细节。这会显示已在 Active Directory 内的容器 IPAS 中创建的计算机对象。

清单 9.
     -bash-4.1# net ads status -U $ADS_username%********
     objectClass: top
     objectClass: person
     objectClass: organizationalPerson
     objectClass: user
     objectClass: computer
     cn: HOSTNAME
     distinguishedName: CN=HOSTNAME,OU=Servers,OU=IPAS,DC=dw,DC=ibm,DC=com
     instanceType: 4
     whenCreated: 20140122165553.0Z
     whenChanged: 20140122165553.0Z
     uSNCreated: 1876615
     uSNChanged: 1876622
     name: ON01P015
     objectGUID: 35ab4986-1775-4214-86ef-47efa308ba2a
     userAccountControl: 69632
     badPwdCount: 0
     codePage: 0
     countryCode: 0
     badPasswordTime: 0
     lastLogoff: 0
     lastLogon: 130348833536553755
     localPolicyFlags: 0
     pwdLastSet: 130348833532803611
     primaryGroupID: 515
     objectSid: S-1-5-21-1679220263-2264458565-1637611664-27733
     accountExpires: 9223372036854775807
     logonCount: 2
     sAMAccountName: DW01P015
     sAMAccountType: 805306369
     dNSHostName: hostname.dw.ibm.com
     userPrincipalName: host/hostname.dw.ibm.com@DW.IBM.COM
     servicePrincipalName: HOST/hostname.dw.ibm.com
     servicePrincipalName: HOST/HOSTNAME
     objectCategory: CN=Computer,CN=Schema,CN=Configuration,DC=dw,DC=ibm,DC=com
     isCriticalSystemObject: FALSE
     dSCorePropagationData: 16010101000000.0Z
     lastLogonTimestamp: 130348833536084987

假设 Kerberos 已正确设置,您还应该能够从本地 keytab 文件 (/etc/krb5.keytab) 看到这些密钥 (KVNO)。标记 -e 可确保还会显示所使用的加密类型(清单 10)。

清单 10.
     -bash-4.1# klist -ke
     Keytab name: WRFILE:/etc/krb5.keytab
     KVNO Principal
     ---- --------------------------------------------------------------------------
     2 host/hostname.dw.ibm.com@DW.IBM.COM (des-cbc-crc)
     2 host/hostname.dw.ibm.com@DW.IBM.COM (des-cbc-md5)
     2 host/hostname.dw.ibm.com@DW.IBM.COM (arcfour-hmac)
     2 host/hostname.dw.ibm.com@DW.IBM.COM (aes128-cts-hmac-sha1-96)
     2 host/hostname.dw.ibm.com@DW.IBM.COM (aes256-cts-hmac-sha1-96)
     2 host/hostname @DW.IBM.COM (des-cbc-crc)
     2 host/hostname @DW.IBM.COM (des-cbc-md5)
     2 host/hostname @DW.IBM.COM (arcfour-hmac)
     2 host/hostname @DW.IBM.COM (aes128-cts-hmac-sha1-96)
     2 host/hostname @DW.IBM.COM (aes256-cts-hmac-sha1-96)
     2 HOSTNAME$@DW.IBM.COM (des-cbc-crc)
     2 HOSTNAME$@DW.IBM.COM (des-cbc-md5)
     2 HOSTNAME$@DW.IBM.COM (arcfour-hmac)
     2 HOSTNAME$@DW.IBM.COM (aes128-cts-hmac-sha1-96)
     2 HOSTNAME$@DW.IBM.COM (aes256-cts-hmac-sha1-96)

7. 修改为 Kerberos SSO 生成的 PAM winbind 配置

接下来,将编辑生成的 /etc/security/pam_winbind.conf 文件,以便修改 PAM winbind 配置。设置以下参数:

  • krb5_auth = yes
  • krb5_ccache_type = FILE
  • winbind refresh tickets = yes

这些选项启用 Kerberos 单点登录 (SSO)。更准确来讲,它们表示在与 Active Directory 域控制器通信时,PAM winbind 将使用 Kerberos 执行身份验证,而且还会使用一个文件来缓存检索的 Ticket Granting Ticket (TGT)。winbind refresh tickets = yes 参数与 krb5_auth = yes 相结合,能够让 winbind 在必要时进行刷新,以保持 TGT 最新。

这可以使用清单 11 中的命令来完成。

清单 11.
     sed -i "s/.krb5_auth.*/krb5_auth = yes/g" /etc/security/pam_winbind.conf
     sed -i "s/.krb5_ccache_type.*/krb5_ccache_type = FILE/g" /etc/security/pam_winbind.conf
     echo "winbind refresh tickets = yes" >> /etc/security/pam_winbind.conf

文件 /etc/security/pam_winbind.conf 现在应该类似于清单 12。

清单 12.
     #
     # pam_winbind configuration file
     #
     # /etc/security/pam_winbind.conf
     #
     
     [global]
     
     # turn on debugging
     ;debug = no
     
     # turn on extended PAM state debugging
     ;debug_state = no
     
     # request a cached login if possible
     # (needs "winbind offline logon = yes" in smb.conf)
     ;cached_login = no
     
     # authenticate using kerberos
     krb5_auth = yes
     
     # when using kerberos, request a "FILE" krb5 credential cache type
     # (leave empty to just do krb5 authentication but not have a ticket
     # afterwards)
     krb5_ccache_type = FILE
     
     # make successful authentication dependend on membership of one SID
     # (can also take a name)
     ;require_membership_of =
     
     # password expiry warning period in days
     ;warn_pwd_expire = 14
     
     # omit pam conversations
     ;silent = no
     
     # create homedirectory on the fly
     ;mkhomedir = no
     winbind refresh tickets = yes

配置 RHEL 6 OS 用户权限

来自 Active Directory 的用户和组集成在 RHEL 6 OS 中后,现在可开始应用权限了。这里显示了一种相对简单的配置,但您也可以根据需要设置更加复杂的权限。

8. 配置 PAM 访问

文件 /etc/security/access.conf 用于控制对 RHEL 6 OS 的访问。使用此文件:

  1. 清除现有的配置文件。
  2. 为所有用户配置对 cronjobs 的访问权。
  3. 除了根用户和之前在 Active Directory 中定义的组的成员之外,拒绝所有用户的访问。

清单 13 中的 shell 脚本展示了如何自动化这些步骤。

清单 13.
     # creating backup of original config file 
     cp /etc/security/access.conf /etc/security/access.conf.bk
     
     # clear existing pam access configuration file
     >/etc/security/access.conf
     
     # configure all users access for cron jobs
     printf "+:ALL:cron\n" >> /etc/security/access.conf
     
     # configure access for root and the user(s) and groups \"${ADS_login_group}\", 
     \"${ADS_middleware_group}\" and \"${ADS_root_group}\"
     if [[ -n ${Local_users} ]];
     then
     for usr in $(echo ${Local_users}|tr "," " ")
     do
     if [[ $usr == "root" ]];
     then
     echo "root found in variable Local_users. This value is not processed. By default 
     root will be added to access.conf."
     continue
     else
     Usrs=$(printf "%s %s" "${Usrs}" "${usr}" )
     fi
     done
     fi
     
     if [[ -n ${Local_groups} ]];
     then
     for gp in $(echo ${Local_groups} |tr "," " ")
     do
     Grps=$(printf "%s %s" ${Grps} "(${gp})" )
     done
     fi
     
     printf "%sALL EXCEPT root%s %s %s %s %s:ALL\n" "-:" "${Usrs}" "${Grps}" "(${ADS_login_group})" 
     "(${ADS_middleware_group})" "(${ADS_root_group})" >> /etc/security/access.conf

/etc/security/access.conf 文件现在应该类似于清单 14。

清单 14.
     +:ALL:cron
     -:ALL EXCEPT root GRP_IPAS_myWorkload_login GRP_IPAS_myWorkload_middleware 
     GRP_IPAS_myWorkload_root :ALL

9. 配置 sudo

修改 /etc/sudoers 文件,以便配置切换 Permissions 节中定义的用户的能力(清单 15)。使用 ${ADS_middleware_users} 变量传递一个本地中间件用户列表。默认情况下,Pure Application System 会使用 virtuser 作为中间件管理员(即 IBM WebSphere Application Server 管理员),但您可以向此列表添加更多的用户。

清单 15.
     # creating backup of original config file 
     cp /etc/sudoers /etc/sudoers.bk
     
     # clear existing sudo configuration file
     >/etc/sudoers
     
     # configure default settings for sudo configuration file
     printf 'Defaults   !visiblepw\nDefaults    always_set_home\nDefaults    env_reset\nDefaults    
     env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"\nDefaults    
     env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"\nDefaults    
     env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"\nDefaults    
     env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"\nDefaults    
     env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"\nDefaults    
     secure_path = /sbin:/bin:/usr/sbin:/usr/bin\n' > /etc/sudoers
     
     # configure root with all permissions in sudo configuration file
     printf "root            ALL=(ALL)       ALL\n" >> /etc/sudoers
     
     # configure members of group ${ADS_middleware_group} to switch to the users 
     \"${ADS_middleware_users}\" in sudo configuration file
     local sudostring=""
     IFS=","
     for username in ${ADS_middleware_users}; do
     sudostring="${sudostring} /bin/su ${username}, /bin/su - ${username}, /bin/su - ${username} 
     -c whoami,"
     done
     unset IFS
     # remove last character from sudostring as it is a ','
     sudostring=`echo ${sudostring} | rev | cut -c 2- | rev`
     printf "%%${ADS_middleware_group} ALL=NOPASSWD:${sudostring}\n" >> /etc/sudoers
     
     # configure members of group ${ADS_root_group} to switch to root in sudo configuration file
     printf "%%${ADS_root_group} ALL=NOPASSWD:ALL\n" >> /etc/sudoers

该文件现在应该类似于清单 16。

清单 16.
     Defaults   !visiblepw
     Defaults    always_set_home
     Defaults    env_reset
     Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
     Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
     Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
     Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
     Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
     Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
     root            ALL=(ALL)       ALL	
     %GRP_IPAS_myWorkload_middleware ALL=NOPASSWD:/bin/su virtuser, /bin/su - virtuser, 
     /bin/su - virtuser -c whoami
     %GRP_IPAS_myWorkload_root ALL=NOPASSWD:ALL

最终确定配置

所有配置完成后,最后一步是在正确设置 messagebusoddjobdsmbwinbind 服务的运行级别后重新启动它们。

10. 配置服务的运行级别

需要为这些服务启用运行级别 2、3、4 和 5:

  • Messagebus
  • Oddjobd
  • Smb
  • winbind

可以通过清单 17 所示的代码完成此操作。

清单 17.
     chkconfig messagebus on --level 2345
     chkconfig oddjobd on --level 2345
     chkconfig smb on --level 2345	
     chkconfig winbind on --level 2345

11. 启动服务

最后一步是确保这些服务都已启动。清单 18 中的脚本展示了如何以自动化方式完成此操作。

清单 18.
     printf "start_services: ensure services \"messagebus\", \"oddjobd\", \"smb\" 
     and \"winbind\" are all started"
     
     # Verify status of service "messagebus" and start if not running yet.
     status=`service messagebus status`
     printf $status
     if [[ $status == "messagebus is stopped" ]]; then
     printf "start_services: messagebus not running, starting..."
     printf "start_services: `service messagebus start`"
     printf "start_services: messagebus started"
     fi
     
     # Verify status of service "oddjobd" and start if not running yet.
     status=`service oddjobd status`
     printf $status
     if [[ $status == "oddjobd is stopped" ]]; then
     printf "start_services: oddjobd not running, starting..."
     printf "start_services: `service oddjobd start`"
     printf "start_services: oddjobd started"
     fi
     
     # Verify status of service "smb" and start if not running yet.
     local status=`service smb status`
     printf $status
     if [[ $status == "smbd is stopped" ]]; then
     printf "start_services: smb not running, starting..."
     printf "start_services: `service smb start`"
     printf "start_services: smb started"
     fi
     
     #Verify status of service "winbindd" and start if not running yet.
     status=`service winbind status`
     printf $status
     if [[ $status == "winbindd is stopped" ]] || [[ $status == "winbindd dead but 
     pid file exists" ]]; then
     printf "start_services: winbind not running, starting..."
     printf "start_services: `service winbind start`"
     printf "start_services: winbind started"
     fi
     
     printf "start_services: all services started"
     return 0

使用 Active Directory 执行 RHEL 6 OS 身份验证

默认情况下,RHEL 6 OS 会执行它的本地密码策略。现在虚拟机使用 Active Directory 执行身份验证,可以禁用 RHEL 本地策略并使用 Active Directory 密码策略。

要禁用 RHEL 6 本地密码策略,可以对 /etc/security/system-auth-ac 执行清单 19 中所示的更改。

清单 19.
     #%PAM-1.0
     # This file is auto-generated.
     # User changes will be destroyed the next time authconfig is run.
     auth        required      pam_env.so
     auth        sufficient    pam_unix.so nullok try_first_pass
     auth        requisite     pam_succeed_if.so uid >= 500 quiet
     auth        sufficient    pam_winbind.so use_first_pass
     auth        required      pam_deny.so
     
     account     required      pam_access.so
     account     required      pam_unix.so broken_shadow
     account     sufficient    pam_localuser.so
     account     sufficient    pam_succeed_if.so uid < 500 quiet
     account     [default=bad success=ok user_unknown=ignore] pam_winbind.so
     account     required      pam_permit.so
     
     # password    requisite     pam_cracklib.so try_first_pass retry=3 type=
     password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
     # password    sufficient    pam_winbind.so use_authtok
     password    sufficient    pam_winbind.so
     password    required      pam_deny.so
     
     session     optional      pam_keyinit.so revoke
     session     required      pam_limits.so
     session     optional      pam_oddjob_mkhomedir.so
     session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
     session     required      pam_unix.so

清单 20 显示了一个执行其密码策略的 Active Directory 例子。

清单 20.
     -bash-4.1$ passwd
     Changing password for user dwuser01.
     Changing password for dwuser01
     (current) NT password:
     New password:
     Retype new password:
     Password does not meet complexity requirements
     Your password must be at least 8 characters; cannot repeat any of your previous 
     10 passwords; must contain capitals, numerals or punctuation; and cannot contain your 
     account or full name; Please type a different password. Type a password which meets these 
     requirements in both text boxes.
     passwd: Authentication token manipulation error

从 Active Directory 删除虚拟机

删除虚拟机时(通常是由于删除了它所属的虚拟系统实例),与该虚拟机关联的主机应离开 Active Directory 域。这会在 Active Directory 中删除相应的计算机对象。您可以发出以下命令来离开域:

net ads leave -U $ADS_username%$ADS_password

变量 $ADS_username$ADS_password 是 Active Directory 服务帐户的用户名和密码。

将各部分结合起来

现在您应该已经了解了如何自动化 Active Directory 集成的配置,可以开始构建脚本包了。然后,这些脚本包可以包含在虚拟系统模式中,您稍后会看到它们。

脚本包

出于本文的用途,我们提供了两个脚本包作为示例:

  • add_ad_os_authentication 必须在创建 VM 时运行,基本上讲,它配置了 VM 并将它集成到 Active Directory 域中。
  • remove_ad_os_authentication 必须在删除 VM 时运行,它会从 Active Directory 域删除这个 VM。

脚本包:add AD OS authentication

这个脚本包执行本文中描述的 1 到 11 步,以便将 RHEL 6 身份验证与 Active Directory 相集成:

  1. 识别配置文件路径
  2. 启动服务
  3. 设置初始 samba 配置
  4. 修改配置文件
  5. 修改 Kerberos 配置
  6. 加入 Active Directory 域
  7. 修改为 Kerberos SSO 生成的 PAM winbind 配置
  8. 配置 PAM 访问
  9. 配置 Sudo
  10. 配置服务的运行级别
  11. 启动服务

在这个脚本包中,RPM 的安装使用脚本包 zip 文件中包含的本地文件来完成。一种更好的解决方案是使用 PureApplication System 所提供的 RedHat OS Update Shared Service。

由于这个示例脚本包使用了本地 RPM 文件,所以引入了一个名为 OS_IMAGE 的额外参数来确保将安装镜像的正确 RPM。它引用从虚拟系统模式使用的目录中获取的针对该模式的每个部分的虚拟镜像。举例而言,这个虚拟镜像的类型可能为 “Core OS 2.0.0.4”、“DB2 Enterprise 9.7.0.8” 或 “WAS 8.5.5.1”。

名称:add AD OS authentication
执行模式:0(在创建虚拟系统时)
描述:安装 RPM 并针对 Directory OS 身份验证进行配置
envonly:TRUE
savevars: 0

表 1. add AD OS authentication 的参数
参数类型是否必需示例值描述
OS_IMAGE(默认)True有效值包括:
BPM 8.0.1.0
BPM 8.5.0.1
Core OS 2.0.0.1
Core OS 2.0.0.3
Core OS 2.0.0.4
Core OS 2.1.0.0
IIS 9.1.0.0 CN
IIS 9.1.0.0 EN
WAS 8.0.0.4
WAS 8.0.0.5
WAS 8.0.0.7
WAS 8.5.0.0
表示用于部署 VM 的虚拟系统镜像。使用此列表来安装正确的 RPM。此列表需要调整。
ADS_username(默认)Trueipasad要与 Active Directory 绑定且拥有添加计算机对象的权限的用户名
ADS_password密码True********上述用户名的密码
ADS_container_shortname(默认)TrueIPAS/Serversnet ads join 命令需要存储计算机对象的容器名称 (OU)。OU 字符串自顶向下读取,没有相对区分名 (RDN),而且使用 “/” 进行分隔。
ADS_workgroup(默认)TrueDW域中的工作组的名称。
ADS_realm(默认)TrueDW.IBM.COMSamba 和 Kerberos 身份验证使用的范围名称。
ADS_login_group(默认)TrueGRP_IPAS_<workload>_loginActive Directory 中的这个组的成员允使用 SSH 登录到操作系统。
ADS_middleware_group(默认)TrueGRP_IPAS_<workload>_middlewareActive Directory 中的这个组的成员允许执行 switch user (su) 来切换到操作系统上的一个或多个不同的技术用户(由 ADS_middleware_users 指定)。
ADS_root_group(默认)TrueGRP_IPAS_<workload>_rootActive Directory 中的这个此组的成员允许执行 switch user (su) 切换为根用户。
ADS_middleware_users(默认)Truevirtuser、db2inst1逗号分隔的列表,包含在 Active Directory 上定义的操作系统上的中间件的技术用户(例如 virtuser、db2inst1 等)。

脚本包:remove AD OS authentication

这个包的用途是确保主机在删除虚拟机时离开域。因此,此脚本包配置为在删除虚拟系统时运行。由于此脚本包将在删除时执行,所以请记住在删除虚拟系统实例时该虚拟机必须在运行。如果该虚拟机停止了,该脚本包将不会执行。

名称:remove AD OS authentication
执行模式:1(在删除虚拟系统时)
描述:从 Active Directory 中删除虚拟机
envonly:TRUE
savevars:0

表 2. remove AD OS authentication 的参数
参数类型是否必需示例值描述
Remove_AD_ADS_container(默认)TrueOU=IPAS,DC=dw,DC=ibm,DC=comActive Directory 中存储计算机对象的容器的区分名。
Remove_AD_ADS_user(默认)Trueipasad要与 Active Directory 绑定且拥有删除计算机对象的权限的用户名
Remove_AD_ADS_password密码True********上述用户名的密码

虚拟系统模式

借助上述两个脚本包,现在可构建一个简单的虚拟系统模式,它将在部署时自动加入一个 Active Directory 域。您需要将这两个脚本包都添加到每个想要 Active Directory 身份验证功能的 VM 上(图 3)。请为 OS_IMAGE 参数仔细选择正确的值,具体情况取决于您希望用来添加该脚本的 VM。

图 3. 示例虚拟系统模式(Pure Application System v2.0 固件)
示例虚拟系统模式(Pure Application System v2.0 固件)
示例虚拟系统模式(Pure Application System v2.0 固件)

使用 Active Directory 凭据登录

清单 21 显示了使用 Active Directory 凭据登录的例子,显示组成员关系。这个组成员关系使用户能够执行 sudo su – virtusersudo –i (root)

清单 21.
     login as: dwuser01
     dwuser01@pas01-grp063.dw.ibm.com's password:
     -bash-4.1$ id
     uid=138373(dwuser01) gid=100513(domain users) groups=100513(domain users),
     138530(GRP_IPAS_myWorkload_login),138531(GRP_IPAS_myWorkload_middleware),
     138532(GRP_IPAS_myWorkload_root)
     -bash-4.1$ sudo -i
     -bash-4.1$ id
     uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
     -bash-4.1$ logout
     -bash-4.1$ sudo su - virtuser
     [virtuser@pas01-grp063 ~]$ id
     uid=1000(virtuser gid=501(virtuser) groups=501(virtuser)
     [virtuser@pas01-grp063 ~]$

使用 SSO 登录

清单 22 显示了用户使用单点登录从一个 VM (pas01-grp063.dw.ibm.com) 登录到另一个 (pas01-grp064.dw.ibm.com) 的示例。因为二者都是同一个 Active Directory 域的成员,所以无需密码,因为 Kerberos 会通过单点登录功能来处理此登录过程。

清单 22.
     login as: dwuser01
     dwuser01@pas01-grp063.dw.ibm.com's password:
     -bash-4.1$ id
     uid=138373(dwuser01) gid=100513(domain users) groups=100513(domain users),
     138530(GRP_IPAS_myWorkload_login),138531(GRP_IPAS_myWorkload_middleware),
     138532(GRP_IPAS_myWorkload_root)
     -bash-4.1$ ssh pas01-grp064.dw.ibm.com
     -bash-4.1$ id
     uid=138373(dwuser01) gid=100513(domain users) groups=100513(domain users),
     138530(GRP_IPAS_myWorkload_login),138531(GRP_IPAS_myWorkload_middleware),
     138532(GRP_IPAS_myWorkload_root)
     -bash-4.1$

虚拟系统模式(经典)

本解决方案与经典虚拟系统模式完全相同,可使用相同的脚本 包。您需要将这两个脚本包都添加到想要 Active Directory 身份验证功能的每个部分上(图 4)。请为 OS_IMAGE 参数仔细选择正确的值,具体情况取决于您希望用来添加脚本包的部分。

图 4. 示例虚拟系统模式(经典)
示例虚拟系统模式(经典)
示例虚拟系统模式(经典)

结束语

将在 IBM PureApplication System 上运行的虚拟机与一个企业 Active Directory 相集成非常有用,因为该集成在各个 IT 基础架构之间实现了一致性。用户和组可以在 Active Directory 中集中管理,并且可以利用现有的密码策略,这大大减少了在 PureApplication System 上维护大量虚拟机的工作。本文介绍了与运行 RedHat OS 的 VM 执行此集成所需的步骤,提供了一组可用于加速该实现的示例脚本包。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Cloud computing
ArticleID=995739
ArticleTitle=在 IBM PureApplication System 上集成操作系统身份验证和 Microsoft Active Directory
publish-date=01212015