作为开发人员,不可避免需要接触服务器,我们需要认证对待这些主机的安全,这份工作本因由专业的系统管理员或者运维人员完成。
 
文章为学习自动化配置虚拟机记录,对虚拟机进行安全强化。
 
前提:
1.主机来自云提供商的虚拟机,具有标准计算机映像。
2.服务器上安装Debian11(Bullseye)或Ubantu。[适用于任何Linux发行版,细节会有所不同]
3.对Shell命令有基本了解,和使用
 
了解攻击:
现在最常见的攻击莫过于机器人扫描了,例如:你购买了云服务器开启SSH密码之后,几十分钟内,你就可以在你的SSH请求日志里面看到许多失败请求了。
查询命令:[last username]:查看最近登录情况,包括用户名,终端,IP地址,登陆时间,持续时间
  [lastlog]:查看各个用户最近一次登录情况。
  [sudo less /var/log/auth.log]:查看日志文件
  [ac]:查看连接 
 
这些机器人扫描互联网以查找任何易攻击的系统。这些攻击通常很容易停止,因为它们在不断的尝试新的地址。
 
基础SSH操作流程:
1.更新软件
即使是刚注册的系统也有可能已过时,甚至存在严重漏洞。
更新命令:[sudo apt update]:更新软件包列表
          [sudo apt upgrade]安装可用软件更新
2.创建用户
强烈建议不要使用root账号直接登录,推荐使用其他账号进行登录,在需要使用超级用户权限是sudo。我的习惯是创建一个新的账号,同时避免使用默认账号,和简单的用户名密码命。
创建命令:[sudo useradd -m -s /bin/bash -G user,sudo username]
:-m 创建用户的主目录,也就是/home/username。
:-s 指定用户登录shell,也就是/bin/bash。
:-G 将用户添加到一些已经存在的用户组中,也就是user和sudo。
:username 需要创建新用户的名字。
 
3.设置密码
 
命令:[sudo passwd username]
 
如果禁止使用SSH密码登录,需要将密钥从默认账号复制到新账户
 
命令:[cp -r `{admin,username}/.ssh}] :复制文件
      [chown -R username:username~username/.ssh/]:修改权限和所有者
注销并以新生发登录,验证是否正常工作
      [sudo bash -c 'echo "i am $USER!"']
输入后,应该要求输入密码。
如果无需密码即可工作,则运行[sudo visudo]并替换[%sudo]行为[%sudo ALL=(ALL:ALL) ALL]
 
完成后,sudo用户组使用sudo时需要输入密码才能
 
4.清除默认账号
命令:[sudo userdel admin]
 
5.禁止ROOT登录
命令:[sudo passwd -l root]:锁定root用户使用密码登录。
查看root账号状态:[sudo passwd -S root]。
 
6.禁止root使用SSH
在[/etc/ssh/sshd_config]文件添加[PermitRootLogin no]
重启生效或者[sudo systemctl restart ssh]
 
7.权限控制[umask]
修改默认值umask,它控制新文件和目录的权限。默认为022,为每个用户提供读取访问权限。
查看当前设置命令:[umask]
为账号创建一个单独权限,例如077。
 
对于sh和bash,我们可以添加umask到/etc/profile
命令:[sudo bash -c 'echo -e "\numask 077">>/etc/profile'] 
 
8.SSH keys
生成命令:[ssh-keygen -t rsa -b 4096]
 
默认情况下SSH从$HOME/.ssh/authorized_keys读取授权密钥,但是如果攻击者发现如果有写入文件的漏洞,则会在这个地址添加公钥。如果只能root添加,则会更安全。
 
创建一个单独的位置来保存公钥
命令:[sudo mkdir -p /etc/ssh/authorized_keys]:创建文件夹
     [sudo chmod 0711 /etc/ssh/authorized_keys]:授予root完全访问权限,其他账号可读取,不能创建文件。
 
我们可以在这个目录中为每个具有ssh访问权限的用户创建一个文件.
如果已存在,可以复制到其他合适的地方。
命令:[sudo cp ~username/.ssh/authorized_keys /etc/ssh/authorized_keys/username]
如果没有。
命令:[sudo bash -c 'echo your public ssh key > /etc/ssh/authorized_keys/username']
 
最后一步,使文件可以被用户读取。
命令:[sudo setfacl -m u:username:r /etc/ssh/authorized_keys/username]
注意:如setfacl未安装,请输入[sudo apt install acl]
 
请确保当前用户可以读取authorized_keys文件,如无法读取,SSH也无法进行读取
命令:[cat /etc/ssh/authorized/keys/$USER]
 
配置SSH从我们创建的位置来读取公钥,打开[/etc/ssh/sshd_config]配置文件
[AuthorizedKeysFile /etc/ssh/authorized_keys/%u]:修改读取位置
[PasswordAuthentication no]:禁止密码登录
 
重启SSH生效
命令:[sudo systemctl restart ssh]
 
注意:如果有旧的authorized_keys文件,请删除[rm ~/.ssh/authorized_keys]
 
 
防火墙配置
理想情况下,SSH无法从互联网访问,我们可以调整防火墙规则来限制特定的IP地址访问。但是大多数时候我们是动态IP,而且又不想使用堡垒机来进行操作,太过复杂,我主要使用的有以下几种方式。
 
1.点对点的VPN(WireGuard)
 
2.基于Debian的系统上我使用ufw
安装命令:[sudo apt install ufw]
开启端口命令[sudo ufw allow in on eth0 to any port 80 proto tcp]:注意使用的网卡eth0,是否一致
开启防火墙:[sudo ufw enable]
 
 
 
自动化配置
如果不熟悉,可以从简单的init脚本写起,在Ansible(或者其他类似工具)。