如何保护服务器

・17 分钟阅读


经常更新您的系统

保持软件最新是你可以为任何操作系统采取的最大安全预防措施,软件更新范围从关键漏洞补丁到小错误修复,许多软件漏洞实际上都是在公开时才修补的。

自动安全更新

记住自动更新只适用于来自存储库的包,而不是自己编译的应用程序,您可能会发现有一个复制生产服务器的测试环境是值得的。更新可以应用到那里,并在应用到现场环境之前检查问题。

  • CentOS使用yum进行自动更新。

  • Debian和Ubuntu使用无人参与升级

  • Fedora使用dnf-automatic 。

添加有限的用户帐户

我们建议创建一个有限的用户帐户,并且在任何时候使用它,管理任务将使用sudo来临时提升你的用户权限,以便你可以管理你的服务器。

注释
如果你得到了 sudo: command not found 在继续之前,安装sudo ,

CentOS/Fedora

  1. 创建用户,用你想要的用户名替换example_user,并指定一个密码:

    
    useradd example_user && passwd example_user
    
    
  2. 将用户添加到sudo权限的wheel组中:

    
    usermod -aG wheel example_user
    
    
    小心
    在CentOS 6中,默认情况下,sudo访问会禁用wheel组,你必须手动配置它,键入root :/usr/sbin/visudo,然后查找行# %wheel,并且取消注释此行,若要开始在vi中键入,请按a ,要保存和退出按Escape,然后键入:w (按回车键),:q (按回车键),

UBUNTU

  1. 创建用户,用你想要的用户名替换example_user ,然后,你将被要求为用户分配密码:

    
    adduser example_user
    
    
  2. 将用户添加到sudo组,这样你将拥有管理特权:

    
    adduser example_user sudo
    
    

Debian

如果你还没有sudo,你将需要在进一步安装之前安装它。

  1. 创建用户,用你想要的用户名替换example_user ,然后,你将被要求为用户分配密码:

    
    adduser example_user
    
    
  2. 将用户添加到sudo组,这样你将拥有管理特权:

    
    adduser example_user sudo
    
    
  3. 创建你的有限用户后,请与Server断开连接:

     
    exit
    
     
  4. 作为新用户重新登录,用你的用户名替换example_user,然后用你的Server地址IP地址来替换这个例子:

    
    ssh example_user@203.0.113.10
    
    

现在你可以用你的新用户帐户代替root来管理你的Server ,可以使用sudo执行几乎所有超级用户命令(示例: sudo iptables -L -nv )这些命令将被记录到/var/log/auth.log

加强SSH访问

默认情况下,密码认证是通过SSH连接到你的Server ,加密密钥对更安全,因为私钥代替密码,这通常更难于强制执行密码,在本节中,我们将创建密钥对,并且配置Server以不接受SSH登录密码。

创建身份验证密钥对

  1. 这是在本地计算机而不是Server上完成的,并且将创建4096-bit RSA密钥对,创建期间,你将被授予使用密码加密私钥的选项,这意味着不能在没有输入密码密码的情况下使用它,除非将它保存到桌面管理器,我们建议你使用密钥对密码对,但是,如果不想使用该密钥对,则可以将该字段留空。

    Linux/OS X

    小心
    如果已经创建了RSA密钥对,该命令将覆盖它,可能会将你锁定在其他系统中,如果已经创建了密钥对,请跳过此步骤,若要检查现有密钥,请运行ls ~/.ssh/id_rsa*
     
    ssh-keygen -b 4096
    
     

    按Enter键使用默认名称id_rsaid_rsa.pub/home/your_username/.ssh中输入密码。

    Windows

    这可以使用Putty来完成,如我们的指南所示: 使用带有SSH的公钥身份验证。

  2. 把公开钥匙传到你的Server上,用计划管理服务器的用户名和203.0.113.10和of地址的IP替换example_user

    Linux

    从你的本地计算机:

    
    ssh-copy-id example_user@203.0.113.10
    
    

    OS X

    在你的Server (作为你的受限用户登录)上:

    
    mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/
    
    

    从你的本地计算机:

    
    scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys
    
    
    注释
    如果你喜欢使用ssh-copy-id,可以在Homebrew中使用,使用brew install ssh-copy-id安装。

    Windows

    • 选项1:可以使用WinSCP完成这个操作,在登录窗口中,输入Server IP地址作为主机名,并输入非根用户名和密码,单击登录连接。

      WinSCP连接后,你将看到两个主要部分,左边的部分显示你本地计算机上的文件,右边的部分显示你Server上的文件,使用左侧的文件资源管理器,导航到保存公钥的文件,选择公钥文件,然后单击上面的工具栏。

      将提示你输入一个路径,你希望将该文件放在你的Server中,将文件上载到 /home/example_user/.ssh/authorized_keys 使用用户名替换example_user

    • 选项2:直接从Putty密钥发生器复制公钥到连接到Server (作为non-root用户)的终端模拟器中:

      
      mkdir ~/.ssh; nano ~/.ssh/authorized_keys
      
      

      上面的命令将在文本编辑器中打开一个名为authorized_keys的空文件,将公钥复制到文本文件中,确保它与Putty生成的单行完全一致,按CTRL+X,然后按Y键,然后输入文件。

    最后,你需要为公钥目录和密钥文件本身设置权限:

    
    sudo chmod -R 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    
    

    这些命令通过阻止其他用户访问公钥目录和文件本身来提供额外的安全层,

  3. 现在退出然后回到你的Server ,如果你为私钥指定了密码句,则需要输入密码。

SSH守护进程选项

  1. 不允许在SSH上登录root ,这要求所有SSH连接都由非根用户,一旦连接了有限的用户帐户,管理特权就可以通过使用sudo或更改为root shell来访问。

    /etc/ssh/sshd_config
    
    1
    2
    3
    
    
    
    # Authentication:
    ...
    PermitRootLogin no
    
  2. 禁用SSH密码身份验证,这要求通过SSH连接的所有用户都使用密钥验证,根据Linux分发版本的不同,可能需要添加行PasswordAuthentication,或者通过删除前导#来取消注释。

    /etc/ssh/sshd_config
    
    1
    2
    
    
    
    # Change to no to disable tunnelled clear text passwords
    PasswordAuthentication no
    
    注释
    如果你从许多不同的计算机连接Server,你可能想保留口令认证,这将允许你使用密码进行身份验证,而不是为每个设备生成和上载密钥对,
  3. 只监听一个互联网协议,SSH守护进程在默认情况下通过IPv4和IPv6监听传入连接,除非你需要使用两个协议来进行,否则不要使用任何不需要的方法,这不会禁用协议系统宽,它只用于SSH守护进程。

    使用该选项:

    • 仅在IPv4上侦听的AddressFamily inet
    • 仅在IPv6上侦听的AddressFamily inet6

    默认情况下,AddressFamily选项不在sshd_config文件中,将它添加到file:的末尾

    
    echo 'AddressFamily inet' | sudo tee -a /etc/ssh/sshd_config
    
    
  4. 重新启动SSH服务以加载新配置。

    如果你使用的是使用systemd (CentOS 7,Debian 8,Fedora,Ubuntu 15.10 )的Linux分发版,

    
    sudo systemctl restart sshd
    
    

    如果init系统是SystemV或Upstart (CentOS 6,Debian 7,Ubuntu 14.04 ):

    
    sudo service sshd restart
    
    

将Fail2Ban用于SSH登录保护

Fail2Ban是一个应用程序,它禁止在多次登录尝试失败后将IP地址登录到你的服务器,由于合法登录通常不超过三个尝试成功,因此一个服务器正在播放失败的登录表示恶意访问。

Fail2Ban可以监视各种协议,包括SSH,HTTP和SMTP ,默认情况下,Fail2Ban只监视SSH,对于任何服务器都是一个有帮助的安全阻塞。

有关安装和配置Fail2Ban的完整说明,请参阅我们的指南: 使用Fail2ban保护你的服务器。

删除未使用的面向网络的服务

大多数Linux发行版都安装了运行网络服务,该服务监听来自internet,回环接口或者两者的连接,为了减少正在运行的进程和安装的包的攻击面,不需要将不需要的网络从系统中删除。

确定运行的服务

要查看Server网络服务的运行情况:

 
sudo ss -atpu

 

下面是ss给出的输出示例,并显示了SSH守护进程(sshd )正在监听和连接,注意,由于发行版默认运行不同的服务,因此你的输出将有所不同。

 

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 *:ssh *:* users:(("sshd",pid=3675,fd=3))
tcp ESTAB 0 208 203.0.113.1:ssh 198.51.100.2:54820 users:(("sshd",pid=3698,fd=3))
tcp LISTEN 0 128 :::ssh :::* users:(("sshd",pid=3675,fd=4))

TCP

查看ss读取的对等Address:Port列,进程sshd侦听*:*,它将任何传入的IPv4地址转换为任何端口,并通过任何网络接口,下一行显示了来自IP地址198.51.100.2的已建立的SSH连接,该连接来自ephemeral端口54820,最后一行,:::*表示侦听任何通过IPv6传入的SSH连接的sshd流程,以及任何网络接口。

Udp

UDP套接字是无状态,意味着它们要么开放要么关闭,并且进程的每个连接都与之前和之后,发生的进程无关,这与侦听,建立和CLOSE_WAIT等TCP连接状态相对应,上面的ss输出显示没有UDP连接。

确定要删除的服务

一个基本的TCP和UDP 扫描没有启用防火墙,将显示SSH和可能监听传入连接的其他服务,通过配置防火墙,你可以将这些端口过滤为你的需求,理想情况下,应该禁用未使用的服务。

你可能主要通过SSH连接管理服务器,因此该服务需要保持,如上所述,RSA密钥Fail2Ban可以帮助保护SSH ,像chronydsystemd-resolveddnsmasq这样的系统服务通常都在监听本地主机,只偶尔与外部,像这样的服务是操作系统的一部分,如果删除和不正确替换,会导致问题。

但是,有些服务是不必要的,除非你对它们有特定的需求,否则应该删除它们,例如,EximApacheRPC

卸载侦听的服务

如何删除违规包将根据您的发行版包管理器而且有所不同。


sudo pacman -Rs package_name


sudo yum remove package_name

Debian/Ubuntu


sudo apt purge package_name

Fedora


sudo dnf remove package_name

再次运行ss -atup以验证不需要的服务不再运行。

配置防火墙

使用防火墙阻止Server的入站流量,提供了一个高效的安全层,通过对允许的流量非常具体,可以防止入侵和网络映射,最佳实践是只允许你所需要的流量,并拒绝其他所有的,有关一些最常见的防火墙应用程序,请参阅我们的文档:

  • iptables是netfilter的控制器,它是Linux内核过滤框架包,默认情况下,大多数Linux发行版中都包含Iptables 。

  • firewalld是用于CentOS/Fedora家族的iptables控制器。

  • UFW为Debian和Ubuntu提供了一个iptables前端。

常见的锁定恢复步骤

如果出于任何原因,在安全控制措施到位后,您发现自己被锁定在您的服务器之外,仍有许多方法可以重新获得对您的服务器的访问权限。

  • 如果您需要通过ssh重新启用密码身份验证和/或root登录到服务器,可以通过撤消此文件的以下部分来反映这些更改,

    /etc/ssh/sshd_config
    
    1
    2
    3
    4
    5
    
    
    
    # Authentication:
    ...
    PermitRootLogin yes
    ...
    PasswordAuthentication yes
    

    从那里,你只需要重启SSH 。

    如果你使用的是使用systemd (CentOS 7,Debian 8,Fedora,Ubuntu 15.10 +)的Linux分发,

    
    sudo systemctl restart sshd
    
    

    如果init系统是SystemV或Upstart (CentOS 6,Debian 7,Ubuntu 14.04 ):

    
    sudo service sshd restart
    
    
  • 如果需要从Server中删除公钥,可以输入以下命令:

    
    rm ~/.ssh/authorized_keys
    
    
Zhongy0410 profile image