以ubuntu系统为例,提升vps安全。
保护小鸡,从我做起。

image.png

# 查看操作系统相关信息
hostnamectl

# update list of available packages 
apt update

# 升级和安装
# apt full-upgrade -y 
apt install vim zsh git nmap ufw curl -y

# 删除不需要的包和依赖
apt autoremove

# who 或者 w 查看当前登陆的用户
# 检查日志和登陆记录
less /var/log/auth.log
who /var/log/wtmp

设置一个足够复杂的密码

  • 不推荐使用单词或短语: superstar, magicmaster, woshiMT
  • 不推荐使用生日加姓名的组合方便记忆的密码: liergou1225, trump2016, jujingyi1994
  • 不推荐使用很长的字母与数字的组合: ABC12345678, qwert9876543210
  • 不推荐使用如下键盘布局的密码: 1qaz@WSX, 1qw2!QW@, 1234!@#$, qwerASDF

请大家知晓:扫描密码是由机器人软件完成,上面列举的这类密码,统统收集在密码词典里或者可以通过算法轻松合成,完全没有安全性可言,无论您自己觉得多么烧脑难记。

所以,请各位设置包括大小写字母和数字在内的、尽可能没有规律的字符串做密码。足够复杂的密码,不在于变换了多少花样,而在于变换花样中找不到规律,从而让扫描软件的词典和算法失效。

  • 推荐使用软件生成如下这种没有规律的密码: .ZHu87Yi$R
# 使用sudo命令或者切换到root用户来更新密码
# sudo passwd root
# su -
passwd root

变更ssh端口为非22

vim /etc/ssh/sshd_config
# 改为你想要的端口,最好在1-1024之间,防止与用户进程端口冲突(可以使用相应命令查下在用的端口)
Port 998

# 应用配置 sudo systemctl restart sshd.service
# sshd,ssh都一样,默认做了alias
service sshd restart # sudo /etc/init.d/ssh restart

# 查看日志 确认更改生效
less /var/log/auth.log

禁止root用户登陆

# 在vps端创建其他用户law,最好不要用会被扫描命中的名字,例如:admin,test,testuser1, foobar
adduser law # adduser 比 useradd 命令更加友好,推荐使用

# 修改用户权限, 为了使用sudo切回root权限,毕竟谁会不喜欢用root用户呢
# 在root用户下安装sudo命令
apt install sudo -y

# 使用命令将新用户law添加到sudoers文件列表中. 
# 这一步其实可以不做,因为后面用到visudo命令为law用户设置执行sudo命令免密。
usermod -a -G sudo law
# 将用户移出组
# gpasswd -d law sudo
# 使用id命令查看用户组别信息
id law
# usermod命令也可以改变用户的shell
# usermod -s /usr/bin/zsh law

# 更改编辑器为vim
sudo update-alternatives --config editor

# 设置用户law免密使用sudo命令. 
# 特别注意:需要使用visudo命令追加到文件中的最后一行。因为变量读取是从上往下,避免被sudo组的权限覆盖。
visudo
# law	ALL=(ALL:ALL) NOPASSWD:ALL

# 删除用户
# deluser law
# 删除用户权限
# visudo 

#----------------------------------------------------
# vim /etc/ssh/sshd_config
#禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no

# 应用配置
service sshd restart # sudo /etc/init.d/ssh restart

设置只允许使用密钥登陆

# 在客户端生成密钥, 如果有就用原来的,不需要执行,这个邮箱无所谓。
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/ww_rsa

# 将客户端的公钥发送给vps的自定义用户
# ssh-copy-id ${shortName} -i 指定私钥文件对应的公钥信息,注意传参事rsa,不是rsa.pub
ssh-copy-id -p ${PORT} -i ${law_rsa} ${USERNAME}@${IP_address}

# vps端配置config
vim /etc/ssh/sshd_config

RSAAuthentication yes  #默认已经允许 RSA 密钥, 不用动
PubkeyAuthentication yes    #默认已经启用公告密钥配对认证方式,不用动
AuthorizedKeysFile  %h/.ssh/authorized_keys    #默认就设定PublicKey文件路径,不用动
PasswordAuthentication no #禁止密码验证登录。如果启用(yes)的话,RSA认证登录就没有意义了,需要取消注释修改为 no

# 应用配置
service sshd restart # sudo /etc/init.d/ssh restart
# 如果哪天你本地的密钥丢了或重置了,那只能进入vps官网使用 VNC 的方式进入服务器上传你的公钥到服务器的authorized_keys文件了。

换了端口和认证方式,降低了被扫描、探测密码的请求 image.png

其实还不够安全,vps上可能还暴露了3306,9200这种端口,需要利用deyhosts实现自动屏蔽疯狂尝试请求的IP。

屏蔽扫描IP,拒绝成为肉鸡

保护小鸡从我做起。

denyhosts是Python语言写的一个程序,它会分析sshd的日志文件,当发现重复的失败登录时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。

# ssh vps
sudo su - 
apt update
apt install denyhosts

# config
vim /etc/denyhosts.conf

# BLOCKPORT = 22 , 默认block所有端口,取消注释指定只 block 22 端口
# PURGE_DENY = 1w
# RESET_ON_SUCCESS = yes
# BLOCK_SERVICE  = sshd

# 应用配置
service denyhosts restart # /etc/init.d/denyhosts restart

# 恢复某个被阻止的IP
sed -i "/$IP/d" /etc/hosts.deny
sed -i "/$IP/d" /var/lib/denyhosts/hosts-valid
sed -i "/$IP/d" /var/lib/denyhosts/users-hosts
sed -i "/$IP/d" /var/lib/denyhosts/hosts
sed -i "/$IP/d" /var/lib/denyhosts/hosts-root
sed -i "/$IP/d" /var/lib/denyhosts/hosts-restricted
iptables -D INPUT -s $IP -j DROP 
# iptables -A INPUT -s $IP -j DROP , ban了某个IP的永久访问

# 还是不放心?还可以更无情的限制IP。 说明: 这只是一个面,其实规则会写入防火墙中
# 首先修改/etc/hosts.allow文件,将可访问服务器ssh服务的客户IP加入其中,格式如下
sshd: 192.168.1.0/255.255.255.0 # 允许这个ip段访问ssh服务
sshd: 202.114.23.45 # 只允许这个ip访问ssh服务
ALL: 211.67.67.89 # 允许这个ip访问所有服务

# 然后修改/etc/hosts.deny文件,加入禁用其它客户连接ssh服务
sshd: ALL
# 或者禁用所有
ALL: ALL

开启(安装)防火墙

关闭不必要的端口, 只开放所需端口。
先过防火墙这关,再去检测是否符合hosts.allowhosts.deny的条件,需要都符合才能通过。

# 使用netstat查看目前开放的端口及链接情况
# -n: don't resolve names 
# -t: tcp 
# -u: udp 
# -p: display PID/Program name for sockets
# -l: display listening server sockets
# -a: display all sockets

# display (default: connected) 
# sudo lsof -i -P -n | grep ESTABLISHED
netstat -ntup 

# sudo lsof -i -P -n | grep LISTEN
netstat -ntupl  

# sudo lsof -i -P -n 
netstat -ntupa

# 端口扫描工具nmap或者netcat
apt install nmap
# 扫描本地端口,禁止扫描他人vps,行为不友好导致banIP。
nmap localhost

# 查看端口进程 
# netstat -ntupa | grep ${port}
lsof -i:${port}


# apt update && apt install ufw 
# 启用ufw(简化iptables命令)
ufw status
ufw enable # 开启后默认关了所有端口

# 先查看vps那些端口在LISTEN,然后开放它(例如 22)
netstat -ntupl
ufw allow 22  # 开放ssh端口,默认的是22
ufw allow 2290:2300/tcp # 端口范围内只允许tcp协议使用
ufw allow 2290:2300/udp # 端口范围内只允许udp协议使用

ufw allow from 192.168.0.104 # 基于IP地址的规则,我比较中意这个。 允许自已指定的IP访问vps上的所有服务(端口)
ufw allow form 192.168.0.0/24 # 也可以使用子网掩码来扩宽范围
ufw allow from 192.168.0.104 to any port 998 # 来自 192.168.0.104 的 IP 只能访问998端口
ufw allow from 192.168.0.104 proto tcp to any port 22 # 限制来自 192.168.0.104 的 IP 只能使用 tcp 协议和通过 22端口 来访问

# nmap检查本地正在监听的端口
nmap -p- 127.0.0.1

# update配置(将开放的端口禁用,例如禁用ftp)
ufw deny ftp
ufw delete allow 22 # 删除某个规则
ufw delete allow ftp # 删除某个规则
ufw reset  # 重置所有规则后需重新启用ufw

# nginx
ufw app list
ufw allow 'Nginx Full' # 放行80和443
# ufw allow 'Nginx HTTP' # 放行80端口
# ufw allow 'Nginx HTTPS' # 放行443端口

# 关闭ufw功能
ufw disable

# ufw相当于简化了iptables命令. 
# 查看vps防火墙全部规则: iptables --list 为准

image.png 先过ufw规则,再过hosts.allow规则, 需要都通过
实现: 只允许IP: 49.xxx.xxx.xxx 访问vps的服务(端口)
至此,心里终于舒坦了很多。

其他

docker

# 安装docker
参考官网相应操作系统的安装方式: https://docs.docker.com/engine/install/debian/
脚本安装: https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script

# 授权非root用户使用docker
参考: https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user

# 跟随系统启动 debian系统不用动,已经设置好了
参考: https://docs.docker.com/engine/install/linux-postinstall/#configure-docker-to-start-on-boot

# 查看系统启动服务 
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service --state=enabled
systemctl list-unit-files --type=service --state=disabled

zsh

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# 自定义配置
~/.zshrc