构建安全的服务器平台

作为管理员,安全性始终是第一位的。本页主要包含系统和服务的安全漏洞相关内容,数据备份在另外的章节描述。

1. 禁止 root 帐号登录 SSH

某个客户服务器接入互联网,允许root登录,虽然设置了长达 9 个字母的口令保护,仍在在 3 天之内被黑客通过暴力口令破解。

原因分析:

  • Unix 服务器上, root 帐号是最知名,权力最大的帐号,一般系统都默认允许 root 帐号远程登录。一些管理员图方便,也喜欢用 root 帐号直接登录系统;

  • 黑客常用的暴力口令破解工具通过口令字典对 root 帐号进行尝试登录;

  • 如果服务器允许 root 登录,很容易被黑客突破;

解决方案: 禁止 root 用户登录。通常有两种设置方法:

  • 方法一: 在 /etc/ssh/sshd_config 中如下设置,禁止 root 用户登录

    • PermitRootLogin no
    • 优点:

      • 设置简单。root 帐号直接被禁止登录

      • 其他用户帐号不受影响,可以登录

    • 缺点:

      • 当需要以 root 身份远程执行某些操作(如同步某些数据),而又不能执行 sudo 命令时,则无法实现

      • SSH 的 22 端口仍然可见

  • 方法二: 在 /etc/ssh/sshd_config 中如下设置,只允许属于某个用户组(如 ssh)的用户登录,而 root 用户不属于该用户组。

    • PermitRootLogin yes
      AllowGroups ssh
    • 优点:

      • root 帐号因不属于该用户组,被禁止登录

      • 如果需要具有 root 权限帐号的用户登录(同步敏感数据的需要),可以为 root 用户创建别名(id 为 0),并属于可登录的用户组

    • 缺点:

      • 系统中原有帐号都不能登录了,需要手动为需要登录的帐号添加到新用户组

      • SSH 的 22 端口仍然可见

其他可选方案:

  • 通过公钥登录 SSH

  • 安装 ossxp-secure-opensesame 软件包,动态打开 ssh 的 22 端口

2. 禁用 22 端口,通过 Web 认证授权,动态打开 ssh 端口

前面介绍的限制 root 登录系统,仍然做不到限制对 22 端口访问。黑客仍然可以使用口令字典尝试对已知帐号进行暴力口令破解。

最根本的解决之道,应该是禁止 22 端口的访问。

  • 难道说将 22 端口改到其他端口么?

    • 决不是。因为黑客可以通过 nmap 或者类似工具对服务器进行端口扫描,可以很快知道你的 SSH 登录的自定义端口!

  • 难道说 SSH 登录,必须在可信网络或者只能在机房的控制台进行登录么?

    • 也不是。失去了方便性的安全性,牺牲了可用性,最终会被抛弃,重回不安全的老路。

解决方案

  • 安装群英汇软件包 ossxp-secure-opensesame

    • opensesame 芝麻开门之意

  • 使用群英汇用户管理平台,为需要访问 ssh 服务的用户进行授权

    • 即在用户的授权服务页中,添加名为 ssh 的服务。

  • 用户登录步骤

    1. 用浏览器打开页面,如: https://servername/opensesame/

      • 输入用户管理系统中为您注册的用户名和口令

      • /!\ 注意:如果用户名口令连续输入错误超过预设值,整个 IP 地址会被拒绝服务(10分钟)

    2. 在打开的 web 页面中选择 ssh 服务,并点击提交按钮

      • opensesame1.png

    3. 在 5 分钟(0-5分钟)之内,用 ssh 客户端登录服务器

      • opensesame2.png

      • 注意登录服务器的用户帐号,由该服务器的管理员分配,和集中管理平台的用户名不同

      • 登录成功后,会一直保持链接,直到退出登录或者服务超时。

      • 如果想重新建立新的 SSH 登录,需要重复步骤 1-3。

3. 普通用户帐号登录,如何成为 root ?

在设置了禁止 root 用户登录后,管理员都需要使用自己的普通权限的帐号进行登录。

有的管理员使用 su 命令成为 root 用户,去执行高授权要求的命令。但是不建议用这个方法。因为:

  • 管理员会倾向于为 root 用户分配弱口令

  • 任何登录用户只要知道 root 口令,都可以成为 root

  • 为登录用户通过口令字典破解 root 口令打开了方便之门

解决方案:

  • 简单的说,解决方案就是使用命令: sudo

    • 建议:将 root 口令取消,或者设置为只有一个人知道的口令。

      • 以 root 身份执行下面的命令,将取消 root 口令,root 用户将无法口令登录。

        # usermod -p '*' root
    • 安装 sudo 软件包

      • # aptitude install sudo
    • 编辑配置文件 /etc/sudoers,增加下面的一条记录,使得只允许 sudo 组的用户能够执行 sudo 命令

      • %sudo ALL=NOPASSWD: ALL
    • 以普通用户帐号(属于 sudo 用户组)登录后,执行下面的命令,即可成为 root 用户

      • $ sudo su

    {i} 安装 ossxp-linux-base 软件包,将会自动完成相关安全性配置。

    • # aptitude install ossxp-linux-base
      # python /opt/ossxp/install/base.py install
      # python /opt/ossxp/install/base.py config

4. 架设防火墙

群英汇缺省使用 shorewall 为客户的服务器架设防火墙。

4.1. 安装

安装 ossxp-secure-fw-shorewall 软件包。

  • $ sudo aptitude install ossxp-secure-fw-shorewall

    {i} ossxp-secure-fw-firestarter 是另外一款适合桌面系统的防火墙软件,有图形界面,但不适合服务器安装。

4.2. 配置注意事项

  1. 编辑配置文件 /etc/default/shorewall, 启用 shorewall 防火墙

    • startup=1
  2. 确认网卡数目和网络拓扑,并编辑配置文件 /etc/shorewall/interfaces

    • 该配置文件缺省是按照一块网卡准备的。下面的配置,是两块网卡的情况

      • net     eth0            detect          dhcp,tcpflags,routefilter,nosmurfs,logmartians=0,arp_ignore=8
        net     eth1            detect          dhcp,tcpflags,routefilter,nosmurfs,logmartians=0,arp_ignore=8
  3. 缺省策略说明

    1. 群英汇系统平台间访问策略

      • 编辑 /etc/hosts 文件,设置下列主机名对应的 IP 地址

        • # open tcp/22 to host: backup-host1, ...
          127.0.0.2   backup-host1
          127.0.0.3   backup-host2
          
          # open tcp/389,636 to host: ldap-mirror1, ...
          127.0.0.2   ldap-mirror1
          127.0.0.3   ldap-mirror2
          
          # open tcp/6663 to host: cosign-client1, ...
          127.0.0.3   cosign-client1
          127.0.0.4   cosign-client2
      • shorewall 重新启动会自动扫描以上的主机名,更新相关的宏(/etc/shorewall/macro.HOST_XXXXXX.in),为在 /etc/hosts 文件中出现的上述主机设置缺省策略

        • $ sudo /etc/init.d/shorewall restart
    2. 用户自定义策略

      • 编辑文件 /etc/shorewall/rules,添加自定义策略。如:

        • DNS/ACCEPT      net     $FW
          HTTP/ACCEPT     net     $FW
          HTTPS/ACCEPT    net     $FW
          SMTP/ACCEPT     net     $FW
          SMTPS/ACCEPT    net     $FW
          POP3/ACCEPT     net     $FW
          POP3S/ACCEPT    net     $FW
          IMAP/ACCEPT     net     $FW
          IMAPS/ACCEPT    net     $FW
          
          # SSH service
          SSH/ACCEPT      net:192.168.0.1/24 $FW
          
          # apt cache
          ACCEPT          net     $FW     tcp 9999
          
          # vmware server
          ACCEPT          net     $FW     tcp 902,8222,8333
          
          # git service
          ACCEPT          net     $FW     tcp 9418
          
          # git service
          ACCEPT          net     $FW     udp 69
          
          # cosign daemon
          HOST_cosign-clients/ACCEPT  net     $FW

4.3. 参考

shorewall 的帮助信息,参考:

5. LDAP 服务安全性

可以使用下面任意方法,加强 LDAP 的安全性。方法一(通过防火墙设置)较为简单。

5.1. 通过防火墙限制客户端IP

在 LDAP 服务器上架设防火墙,安装群英汇软件包: ossxp-secure-fw-shorewall。详见本帮助文档相关章节。

编辑文件 /etc/hosts,为需要访问 LDAP 服务器的客户端设置相应的 host 条目。格式示例:

  • # open tcp/389,636 to host: ldap-mirror1, ...
    192.168.0.101   ldap-mirror1
    192.168.0.105   ldap-mirror2
    10.0.0.50       ldap-mirror3

重启 shorewall 防火墙后,自动为上述主机开放 389 和 636 端口。

5.2. 禁止 LDAP 匿名查询

Debian 和 Ubuntu 的 openldap 的默认配置文件格式不相同。Debian 使用传统的配置文件方式, 而 Ubuntu 使用 LDAP数据库(LDIF 文件)格式进行配置。

对于使用 /etc/ldap/slapd.conf 配置文件的 openldap 服务。修改配置文件中关于授权的指令:

  • 缺省的授权策略

    1. 口令相关字段,允许用户查看和更改自己口令,允许管理员(cn=admin,dc=foo,dc=bar)查看和更改所有人口令,匿名用户禁止访问

      • access to attrs=userPassword,shadowLastChange
                by dn="cn=admin,dc=foo,dc=bar" write
                by anonymous auth
                by self write
                by * none
    2. 其他字段,允许任何用户读取,但只有管理员(cn=admin,dc=foo,dc=bar)有权更改

      • access to *
                by dn="cn=admin,dc=foo,dc=bar" write
                by * read
  • 关闭匿名查看之后的授权策略

    1. 在缺省配置的基础上,增加了一个只读口令字段的帐号。即允许一个帐号(cn=sniffer,dc=foo,dc=bar)查看所有人口令

      • access to attrs=userPassword,shadowLastChange
                by dn="cn=admin,dc=foo,dc=bar" write
                by dn="cn=sniffer,dc=foo,dc=bar" read
                by anonymous auth
                by self write
                by * none
    2. 其他字段的访问,关闭匿名查看,只允许登录的用户访问,只有管理员(cn=admin,dc=foo,dc=bar)有权更改

      • access to *
                by dn="cn=admin,dc=foo,dc=bar" write
                by anonymous auth
                by * none
  • 如果有软件只需要一个访问非口令字段的 LDAP 帐号,直接在 LDAP 中添加一个专用帐号,例如: cn=reader,dc=foo,dc=bar

  • 如果有软件需要一个能够读取口令字段的只读用户,就需要在 LDAP 中添加帐号 cn=sniffer,dc=foo,dc=bar,并为其设置复杂一些的口令

    • /!\ 注意:

      1. 很对软件是通过先在 LDAP 中搜索 dn,然后在用检索到的 dn 和用户提供的口令进行和 LDAP 的绑定,之后利用再访问该用户的口令字段。因此对于这些软件,只需要提供一个能够访问非口令字段的只读帐号即可。

      2. 如果确实需要设置一个具有读取口令字段的只读帐号,还需要修改 slapd.conf 配置文件,增添授权策略,设置该用户对口令字段拥有只读权限

对于在目录 /etc/ldap/slapd.d/下,用LDAP格式文件进行设置的 openldap 服务,在阅读上面相关内容后,参考下面的链接文档:

6. HTTP 服务安全性

  • 如何限制对某些 http 服务的IP地址访问范围?

    • 群英汇的每个web应用,都对应于一个 IP 地址授权设置。这些 IP 地址授权配置文件在目录 /etc/apache2/include/authz_host/ 下。

    • 只需要修改 /etc/apache2/include/authz_host/ 下对应的配置文件,就可以完成对该服务的授权。

    • 例如:

      • $ cat /etc/apache2/include/authz_host/wiki
        ###################################################################
        # Example:
        #   Order Allow,Deny
        #   Allow from 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
        #
        #   Order Deny,Allow
        #   Deny from all
        #   Allow from 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
        ###################################################################
        Order Allow,Deny
        Allow from all
  • 如何防止针对 web 应用的口令攻击?

    • 安装 ossxp-secure-fail2ban 软件包。


群英汇帮助类