CentOS 7 下 OpenLDAP 安装配置

目标是ldap1和ldap2做成高可用LDAP为集群中所有节点提供身份验证服务。

一、LDAP服务端,ldap1和ldap2均需安装配置

安装OpenLDAP并导入基本定义

yum install -y openldap openldap-clients openldap-servers
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap
systemctl enable slapd.service
systemctl start slapd.service
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif

修改LDAP基本配置

  1. 创建db.ldif,内容见后
  2. olcRootDN就是LDAP的超级用户
  3. 用slappasswd生成密码的哈希填入olcRootPW中做为olcRootDN的密码
  4. 修改dc=为自己的域
  5. monitor默认所有用户均可读取,通过添加olcAccess改为只有root和RootDN可以读取
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcSuffix
    olcSuffix: dc=yaoge123,dc=com
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootDN
    olcRootDN: cn=Manager,dc=yaoge123,dc=com
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootPW
    olcRootPW: {SSHA}lY3iu244B87mEjUzSyHboD3x0tjTRHCV
    
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: stats2 shell sync
    
    dn: olcDatabase={1}monitor,cn=config
    changetype: modify
    replace: olcAccess
    olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
      by dn.base="cn=Manager,dc=yaoge123,dc=com" read
      by * none
  6. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif

生成证书并设置TLS

  1. OpenLDAP默认使用明码传输,为了加密数据必须生成证书并配置TLS
  2. 在一个安全的服务器上生成CA的私钥和证书,有效期20年
    openssl req -new -x509 -nodes -out ca-cert.pem -keyout ca-key.pem -days 7305
  3. 在LDAP服务器生成私钥和证书请求,证书CN需为客户端访问使用的地址(域名、机器名、IP)
    openssl req -new -nodes -out cert.csr -keyout key.pem
  4. 用CA签发证书,有效期20年
    openssl x509 -req -in cert.csr -CAkey ca-key.pem -CA ca-cert.pem -out cert.pem -set_serial 01 -days 7305
  5. 把CA证书、服务器私钥和证书放到/etc/openldap/certs下,并修改属主和权限
    mv ca-cert.pem cert.pem key.pem /etc/openldap/certs/
    chown -R ldap:ldap /etc/openldap/certs/{ca-cert,cert,key}.pem
    chmod 644 /etc/openldap/certs/ca-cert.pem
    chmod 644 /etc/openldap/certs/cert.pem
    chmod 600 /etc/openldap/certs/key.pem
  6. 创建certs.ldif
    dn: cn=config
    changetype: modify
    replace: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/openldap/certs/ca-cert.pem
    
    dn: cn=config
    changetype: modify
    replace: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/openldap/certs/cert.pem
    
    dn: cn=config
    changetype: modify
    replace: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/openldap/certs/key.pem
  7. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f certs.ldif
  8. 修改LDAP服务端配置/etc/sysconfig/slapd,只启用ldapi和ldaps
    SLAPD_URLS="ldapi:/// ldaps:///"
  9. 重启LDAP服务
    systemctl restart slapd.service
  10. 验证TLS,可以看到证书链中有CA和LDAP服务器两个证书,最后显示Verify return code: 0 (ok)
    openssl s_client -connect ldap1:636 -showcerts -state -CAfile /etc/openldap/certs/ca-cert.pem
    
  11. ldap1已完成,从3.生成私钥和证书请求开始为ldap2配置,注意签发证书时set_serial需要不同,签发证书有效期需在CA证书有效期内
  12. 检查证书
    openssl req -in cert.csr -noout -text  //查看证书请求文件
    openssl x509 -in cert.pem -noout -text  //查看证书

创建自己的域

  1. 创建一个文本文件base.ldif,内容见后
  2. 修改dc为自己的域名
    dn: dc=yaoge123,dc=com
    dc: yaoge123
    objectClass: top
    objectClass: domain
    
    dn: ou=People,dc=yaoge123,dc=com
    ou: People
    objectClass: top
    objectClass: organizationalUnit
    
    dn: ou=Group,dc=yaoge123,dc=com
    ou: Group
    objectClass: top
    objectClass: organizationalUnit
  3. 用ldapadd导入,输入RootDN密码
    ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f base.ldif

LDAP复制

  1. OpenLDAP 2.4支持5种复制方式,其中MirrorMode提供LDAP读写高可用性,双机Active-Active Hot-Standby,前端写入一个服务器即可,双机互相同步复制,只有一个服务器的情况下也支持写入
  2. 创建mod_syncprov.ldif
    dn: cn=module,cn=config
    objectClass: olcModuleList
    cn: module
    olcModulePath: /usr/lib64/openldap
    olcModuleLoad: syncprov.la
  3. 用ldapadd导入
    ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
  4. 创建syncprov.ldif
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: entryCSN,entryUUID eq
    
    dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
    changeType: add
    objectClass: olcOverlayConfig
    objectClass: olcSyncProvConfig
    olcOverlay: syncprov
    olcSpCheckpoint: 100 10
    olcSpSessionLog: 100
  5. 用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
  6. 创建syncuser.ldif,创建用于同步的用户,用slappasswd生成密码的哈希填入userPassword中做为同步用户的密码
    dn: cn=ldapreader,dc=yaoge123,dc=com
    objectClass: simpleSecurityObject
    objectClass: organizationalRole
    cn: ldapreader
    description: LDAP reader user 
    userPassword: {SSHA}95M+f4bXaOF4DwJ5HdMY75kkqNXEFJRU
  7. 用ldapadd导入,输入RootDN密码
    ldapadd -x -W -D cn=Manager,dc=yaoge123,dc=com -H ldapi:/// -f syncuser.ldif
  8. 创建ldap1sync.ldif,credentials需为同步用户的密码
    dn: cn=config
    changeType: modify
    add: olcServerID
    olcServerID: 1
    
    dn: olcDatabase={2}hdb,cn=config
    changeType: modify
    add: olcSyncrepl
    olcSyncrepl: rid=001 provider=ldaps://ldap2 bindmethod=simple binddn="cn=ldapreader,dc=yaoge123,dc=com" credentials=yaoge123 searchbase="dc=yaoge123,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" tls_cacert=/etc/openldap/certs/ca-cert.pem
    -
    add: olcMirrorMode
    olcMirrorMode: TRUE
  9. 在ldap1上用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap1sync.ldif
  10. 创建ldap2sync.ldif,credentials需为同步用户的密码
    dn: cn=config
    changeType: modify
    add: olcServerID
    olcServerID: 2
    
    dn: olcDatabase={2}hdb,cn=config
    changeType: modify
    add: olcSyncrepl
    olcSyncrepl: rid=001 provider=ldaps://ldap1 bindmethod=simple binddn="cn=ldapreader,dc=yaoge123,dc=com" credentials=yaoge123 searchbase="dc=yaoge123,dc=com" schemachecking=on type=refreshAndPersist retry="60 +" tls_cacert=/etc/openldap/certs/ca-cert.pem
    -
    add: olcMirrorMode
    olcMirrorMode: TRUE
  11. 在ldap2上用ldapmodify导入
    ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap2sync.ldif
  12. 修改其中一个服务器上的LDAP,查看另一个服务器是否自动同步。
  13. 如果同步有问题,用调试模式运行ldap
    /usr/sbin/slapd -u ldap -g ldap -h "ldapi:// ldaps://" -d -1

迁移已有用户

  1. 安装迁移工具
    yum install -y migrationtools
  2. vi /usr/share/migrationtools/migrate_common.ph,修改默认dc
    # Default DNS domain
    $DEFAULT_MAIL_DOMAIN = "yaoge123.com";
    
    # Default base
    $DEFAULT_BASE = "dc=yaoge123,dc=com";
    
  3. 处理一下passwd和group,把系统账号都去掉,对于RHEL7/CentOS7来说,系统账号都是<1000的,migrate_passwd.pl会从/etc/shadow提取密码信息
    grep ":10[0-9][0-9]" /etc/passwd > passwd
    grep ":10[0-9][0-9]" /etc/group > group
    /usr/share/migrationtools/migrate_passwd.pl passwd users.ldif
    /usr/share/migrationtools/migrate_group.pl group groups.ldif
  4. 导入LDAP中,输入RootDN密码
    ldapadd -x -W -D "cn=Manager,dc=yaoge123,dc=com" -H ldapi:/// -f users.ldif
    ldapadd -x -W -D "cn=Manager,dc=yaoge123,dc=com" -H ldapi:/// -f groups.ldif
    
  5. 创建index.ldif,做一些索引,最好日志中没有bdb_equality_candidates
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcDbIndex
    olcDbIndex: uid,uidNumber,gidNumber,member,memberUid eq
  6. 导入LDAP中
    ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif

修改LDAP ACL:

  1. 密码和密码修改时间,RootDN可管理,自己可写,同步用户可读,匿名和普通用户只能Bind进行认证
  2. 其它所有RootDN可管理,匿名和普通用户可读
  3. 以上ACL保证了密码安全性,做成一个access.ldif文件
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcAccess
    olcAccess: {0}to dn.children="dc=nnlmhpcc" attrs=userPassword,shadowLastChange
      by dn="cn=Manager,dc=nnlmhpcc" manage
      by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
      by dn="cn=ldapreader,dc=nnlmhpcc" read
      by self write
      by * auth
    olcAccess: {1}to *
      by dn="cn=Manager,dc=nnlmhpcc" manage
      by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
      by * read
    
  4. 导入LDAP中,输入RootDN密码
    ldapmodify -Y EXTERNAL -H ldapi:/// -f access.ldif
  5. 确认匿名和普通用户无法查看密码,两台LDAP同步正常(含密码),用户自己可以自己修改密码
  6. 如果有问题,用ldapmodify -Y EXTERNAL -H ldapi:/// -f导入下面的文件打开ACL的日志检查,检查完别忘了把ACL日志关掉
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: acl stats stats2 shell sync

LDAP认证的客户端:

  1. 安装nss-pam-ldapd
    yum install -y nss-pam-ldapd
  2. 配置普通用户使用LDAP认证,因为已经使用ldaps故需disableldaptls,bashdn下必须包含People和Group
    authconfig --enableldap --enableldapauth --ldapserver="ldaps://ldap1,ldaps://ldap2" --ldapbasedn="dc=yaoge123,dc=com" --disableldaptls --ldaploadcacert=http://www.yaoge123.com/ca-cert.pem --updateall
  3. 测试用户登录、修改密码是否正常。

对于虚拟化部署的ldap1和ldap2,需要添加规则让两个虚机不在同一个主机上运行。

集群节点较多时,slapd会报错Too many open files。参考http://smilejay.com/2016/06/centos-7-systemd-conf-limits/和http://www.cnblogs.com/chris-cp/p/6667753.html,修改slapd的Max open files限制, 查看限制:

grep files /proc/`pidof slapd`/limits

 

 

xCAT 安装迁移

新机器安装系统,配置yun源、Hostname、Timezone、resolv.conf、路由和每个网卡的IP,yum upgrade,禁用SELinux和Firewall,hosts中配置本机主机名和ip,如公网网卡采取DHCP 配置中需添加PEERDNS=no 和 IPV6_PEERDNS=no

VM虚拟机中安装vmware tools,vmware-toolbox-cmd timesync status确认时间同步是否启用,vmware-toolbox-cmd timesync enable启用虚拟机和主机的时间同步

yum install rsync net-snmp-utils

重启后使用go-xcat install 自动化安装xcat

tabedit site:添加修改dhcpinterfaces、managedaddressmode、domain、master、dnsinterfaces、extntpservers;确认forwarders、nameservers。

tabedit networks:确认修改mgtifname、gateway、dhcpserver、tftpserver、ntpservers

修改/etc/resolv.conf,search为site表中的domain,nameserver为xcat自身

makedns,测试dns是否正常

修改/etc/chrony.conf,测试ntp是否正常

修改/etc/exports,限定IP地址范围

修改/etc/httpd/conf/httpd.conf,限定只监听内网的80端口

修改/etc/logrotate.conf,满足合规性要求,增加日志保留时间并启用压缩

迁移/etc/hosts.deny和hosts.all,配置只允许指定IP进行远程登录

修改/etc/postfix/main.cf中的myhostname和inet_interfaces

拷贝旧机器/install下的os image、自定义脚本等到新机器下

tabedit passwd:添加system的用户名密码,密码可以用openssl passwd -1加密

旧机器导出xCAT数据库dumpxCATdb -p /tmp/db,至少将nodelist chain bootparams nodetype mac hosts postscripts noderes nodehm osimage linuximage osdistro ipmi mp mpa等自定义表在新机器上restorexCATdb -p导入

如果需要迁移eventlog和auditlog,导入导出需添加-a参数,auditlog因为比较大导入非常慢

迁移/var/log下的日志

替换root ssh key为新的

迁移/etc/cron.d下的自定义定时任务

Linux DHCP 下自定义路由和网关

主机IP必须通过DHCP获得,但是因故需要重新指定网关并做策略路由。例如主机DHCP获取IP段192.168.1.0/24,DHCP获取网关192.168.1.1,拟将默认路由改为192.168.1.2,本地IP仍然走网关192.168.1.1

RHEL(CentOS) 6/7

/etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp
NM_CONTROLLED="no"
ONBOOT=yes
GATEWAY=192.168.1.2
……

/etc/sysconfig/network-scripts/route-eth0
192.168.0.0/16 via 192.168.1.1

/etc/sysconfig/network
NETWORKING=yes
……

Debian 7

/etc/network/interfaces
……
up route del default dev eth0
up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 dev eth0
up route add default gw 192.168.1.2 dev eth0
……

Suse 11

/etc/sysconfig/network/routes
……
192.168.0.0 192.168.1.1 255.255.0.0 eth0
default 192.168.1.2 - -

 

RHEL6 正确关闭IPv6的方法

正确的方法是:

sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
sed -i '/net.ipv6.conf.all.disable_ipv6=/d' /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf
sed -i '/net.ipv6.conf.default.disable_ipv6=/d' /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6=1" >> /etc/sysctl.conf

/etc/ssh/sshd_conf中的AddressFamily any改为AddressFamily inet,否则sshd会有问题

/etc/modprobe.d/ 目录下新建一个文件,内容为install ipv6 /bin/true,的确能关闭IPv6但是会导致网卡bonding失败等各种问题

/etc/sysconfig/network 里面添加NETWORKING_IPV6=no 或者 IPV6INIT=no 都是没有用的

GPFS增加/dev/cciss/c0d0类设备解决方法

比如hp的dl380g5服务器,raid的逻辑盘在linux中不是/dev/sda而是/dev/cciss/c0d0,mmcrnsd的时候正常,但是mmcrfs的时候报错“Unable to open disk”,使用mmlsnsd -m则有如下显示:

 Disk name    NSD volume ID      Device         Node name                Remarks       
—————————————————————————————
 io00nsd01    0A01C866666C04EB   –              io00                     (not found) server node

解决方法:
cp /usr/lpp/mmfs/samples/nsddevices.sample /var/mmfs/etc/nsddevices
vim /var/mmfs/etc/nsddevices
在$osName = Linux 增加 echo "/dev/cciss/c0d0p4 generic",取消最后return 1的注释,echo中的/dev/cciss/c0d0p4必须和你的nsd描述文件中的device完全一致
chmod +x /var/mmfs/etc/nsddevices

万兆TOE测试

测试环境:IBM HS22 X5650 24Gram Chelsio T420-BCH 关闭超线程 两台,BNT Virtual Fabric 10Gb Switch Module for IBM BladeCenter 两台,RHEL 6.3,ChelsioUwire-2.2.0.0,iperf 2.0.5 (08 Jul 2010) pthreads

详细测试结果见下面的表格,显而易见,万兆TOE还是非常有必要的,否则光对10GB的TCP流量进行基本处理就耗尽CPU资源了。

Continue reading

FreeBSD 打开文件数限制

samba报错smbd’s max open files = 16384
一般是系统的open flies限制

查看系统限制:
[root@storage ~]# sysctl -a | grep maxfiles
kern.maxfiles: 12328
kern.maxfilesperproc: 11095
kern.openfiles: 8760
FreeBSD 8.2,默认系统打开文件数12328,每进程打开文件数11095,kern.openfiles是系统当前打开文件数。

设置新的系统限制:
[root@storage ~]# sysctl kern.maxfiles=65536
[root@storage ~]# sysctl kern.maxfilesperproc=32768

查看某个进程的系统限制,nofile就是这个进程打开文件数的限制
24443是某个smbd的pid
[root@storage ~]# mount -t procfs proc /proc
[root@storage ~]# cd /proc/24443
[root@storage /proc/24443]# ls -l
total 0
-r–r–r–  1 root  wheel  0 Nov  7 20:15 cmdline
———-  1 root  wheel  0 Nov  7 20:15 ctl
———-  1 root  wheel  0 Nov  7 20:15 dbregs
-r–r–r–  1 root  wheel  0 Nov  7 20:15 etype
lr–r–r–  1 root  wheel  0 Nov  7 20:15 file -> /usr/local/sbin/smbd
———-  1 root  wheel  0 Nov  7 20:15 fpregs
-r–r–r–  1 root  wheel  0 Nov  7 20:15 map
———-  1 root  wheel  0 Nov  7 20:15 mem
———-  1 root  wheel  0 Nov  7 20:15 note
———-  1 root  wheel  0 Nov  7 20:15 notepg
———-  1 root  wheel  0 Nov  7 20:15 osrel
———-  1 root  wheel  0 Nov  7 20:15 regs
-r–r–r–  1 root  wheel  0 Nov  7 20:15 rlimit
-r–r–r–  1 root  wheel  0 Nov  7 20:15 status
[root@storage /proc/24443]# cat rlimit
cpu -1 -1
fsize -1 -1
data 34359738368 34359738368
stack 536870912 536870912
core -1 -1
rss -1 -1
memlock -1 -1
nproc 5547 5547
nofile 32768 32768
sbsize -1 -1
vmem -1 -1
npts -1 -1
swap -1 -1

/etc/login.conf可以配置某个用户的系统资源限制,默认是无限制的,就是受限于系统内核限制

/etc/sysctl.conf里面配置对开机启动的服务无效

/boot/loader.conf里面配置对开机启动的服务有效