以下环境基于ubuntu/debian,其他系统类似。
更新系统
旧版本的软件可能会含有某些漏洞,从而成为攻击者发起攻击的基础。所以养成定期更新系统是个好习惯。
更新系统使用以下命令
sudo apt-get update && sudo apt-get upgrade
使用非root用户
新购置的vps默认开通root权限,除非你的密码非常复杂,或者使用SSH key登陆,不然强烈建议使用非root用户。
创建非root用户
创建新用户组
sudo groupadd -g 344 test
344
叫做 gid
,可以随便取,但必须是整数。test
为用户组名
0是root用户组专用gid。
另外,1000
、100
也是很常见的内置用户组gid。如果你打算用这些用户组,可以不需要运行此命令。
创建新用户
为 test
用户组创建一个用户,名字叫做 test_user
。
# 创建一个新用户 sudo useradd \ -m -d /home/test_user `#自动创建用户目录`\ -s /bin/bash `#设置默认shell`\ -g test `#主组`\ -G sudo `#副组`\ test_user
或者使用下面的写法
sudo useradd -m -d /home/test_user -s /bin/bash -g test -G sudo test_user
删除用户(组)
# 删除用户 sudo userdel test_user # 删除用户组 sudo groupdel test
注意,要将所有的用户删除后才可以删除用户组。
设置密码
# 设置密码 sudo passwd test_user # 假设我输入了testtest
要输入两次密码并完全一样才会生效,密码不会在屏幕上显示
New password: Retype new password: passwd: password updated successfully
这个密码,在调用 sudo
的权限时会用到。
切换用户
su test_user # su <用户名>
如果你目前的用户级别不比 test_user
高,它会要求你输入密码。这个密码就是 testtest
。
如果你是 root
,直接就切换过去了。
显示用户
显示主机都有哪些用户
sudo less /etc/passwd
最下面应该是新的用户。按 q
可以终止less命令的使用。
观察home目录
进入新用户的home目录
cd ~
看目录内的内容
ls -hl
输出 total 0
,表示什么都没有。
这时,观察一下home目录的绝对路径
pwd
输出 /home/test_user
。
在Linux里创建新用户就完成了。
探索sudo
尝试与 root
交互
cd /root
输出 bash: cd: /root: Permission denied
。
因为我们是普通用户,没有办法进入 root
的目录。
尝试能不能使用 sudo
sudo apt-get update
输入密码后可以正常运行。
输入以下命令,观察我们的用户
id
输出如下
uid=1002(test_user) gid=344(test) groups=344(test),27(sudo)
uid
是用户的id,gid
是用户组的id。这里看到 test_user
属于 test
和 sudo
两个用户组。如果 test_user
不属于 sudo
用户组,它将不可以使用 sudo
!
查看 /etc/sudoers
文件
ls -hl /etc/sudoers
输出是
-r--r----- 1 root root 825 Apr 17 14:01 /etc/sudoers
在默认状态下,该文件就算是 root
用户也只可以查看而不可以改动。
它控制了用户对于 root
权限调用的程度。
修改该文件权限,先运行以下命令
sudo chmod +600 /etc/sudoers
然后Vim编辑
sudo vim /etc/sudoers
输出内容类似于以下
# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # timestamp_timeout=30即有效期改成30分钟。 Defaults env_reset, timestamp_timeout=30 Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # User privilege specification root ALL=(ALL:ALL) ALL ...
如更新系统运行 sudo apt-get update
时,你要输入密码,默认密码授权时间是5分钟。
可以修改时长,如30min。
将 Defaults env_reset
来改为 Defaults env_reset, timestamp_timeout=30
即可。
Vim退出 :wq
后生效。如果不想改,直接 :q!
退出。
将该文件权限恢复默认
sudo chmod -w /etc/sudoers && ls -hl /etc/sudoers
输出为
-r--r----- 1 root root 847 Apr 19 13:38 /etc/sudoers
即时强行结束 sudo
的授权
sudo -K
此后再调用 sudo
权限,就要再次输入用户密码获得授权。
禁用root使用ssh登陆
图片中通过 ssh user@ip
的方式登陆VPS
一般情况下,主机是允许 root
用户远程登陆的。而 root
用户的名字一般就是 root
。所以,如果攻击者知道你VPS的ip地址(ping你的域名获得)、用户名(默认root)和ssh端口号(默认22),那么保护你的VPS就只有用户密码了。如果你的密码是弱口令被破解,那你的VPS就任人鱼肉了!
所以使用非root用户可以在用户名这个层面上增强VPS的安全防护。
用一个新的非root用户,然后禁root远程登陆
编辑ssh程序配置文件
sudo vim /etc/ssh/sshd_config
打开后的内容类似以下
#Port 22 #AddressFamily any AddressFamily inet #ListenAddress 0.0.0.0 #ListenAddress :: #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_ecdsa_key #HostKey /etc/ssh/ssh_host_ed25519_key # Ciphers and keying #RekeyLimit default none # Logging #SyslogFacility AUTH #LogLevel INFO # Authentication: #LoginGraceTime 2m PermitRootLogin no (就是这里!!) # PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10
找到 PermitRootLogin
参数,把值 yes
改成 no
。注意去掉前面的 #
号。:wq
退出保存。
重启ssh服务后生效
sudo service sshd restart
注意:不要关闭旧的
Shell
!新开一个Shell
,用刚刚的非root用户登陆Shell
,成功后再关闭旧的Shell
窗口。切记切记!
隐藏公网ip
获取公网ip
curl ifconfig.me
也可以在VPS控制面板中找到。
隐藏ip之前,要准备一个域名并托管在cloudflare上。
登陆cloudflare的后台:Cloudflare | Web Performance & Security
点击托管的域名,选择 DNS
。
添加一条记录,如:
关掉小黄云,先 仅限DNS
模式。最后保存。
回到shell中,用以下命令ping你的VPS
ping abcd.<你的泛域名> # 演示中是abcd.hwb0307.com
如果可以返回准确的ip,再回到clouldflare后台,将小黄云点开
保存后生效
ping abcd.<你的泛域名> # 我这个记录就是abcd.hwb0307.com
这时ip已经发生变化了。
真实的IP已经被cf隐藏起来了。
如果VPS上有NPM之类的反向代理服务正在反代你的个人网站(比如博客),此时访问网站会出现 ERR_TOO_MANY_REDIRECTS
的报错。
cf官方是这样解释的
Cloudflare SSL/TLS 应用中的灵活 SSL 选项通过 HTTPS 加密浏览器和 Cloudflare 网络之间的流量。但是,当启用灵活SSL选项时,Cloudflare 会通过 HTTP 将请求发送到未加密的源 Web 服务器。如果您的源 Web 服务器配置为在使用灵活 SSL 选项时将所有 HTTP 请求重定向到 HTTPS,则会发生重定向循环。
解决重定向循环的方法就是:SSL/TLS 的 灵活模式 改为 完全模式
这时候,网站使用NPM(或者Nginx)的证书(通常是来自Let’s Encrypt的免费个人证书)而不是CF证书来保证https请求的安全性。
安装UFW防火墙
检查自己的机器有没有 ufw
which ufw # /usr/sbin/ufw
如果没有运行以下命令安装
sudo apt-get install ufw
用 sudo ufw status
查看防火墙状态。
如果之前没有设置过 ufw
,一般是显示 Status: inactive
设置 ufw
- 设置
ufw
的默认值
sudo ufw default deny incoming # 禁止所有进站的流量 sudo ufw default allow outgoing # 允许所有出站的流量
- 允许https/http连接
sudo ufw allow 80 # 默认http sudo ufw allow 443 # 默认https
- 允许新ssh端口
sudo ufw allow 1234/tcp comment 'SSH_2' # 1234换成你自定义的端口
如果你安装了宝塔或者1panel,80和443端口是由Nginx软件管理。而且宝塔面板默认关闭其他端口。
- 开放端口
sudo ufw allow <你的端口号>/tcp comment '你想要的备注'
- 启动ufw
sudo ufw enable # 启动ufw。重启主机后正式生效
其它常用的命令
# 查看帮助 ufw -h # 如果你改动了ufw规则,记得reload一下生效 sudo ufw reload # 显示规则的数字 sudo ufw status numbered # 删除某个规则。基于sudo ufw status numbered命令。 sudo ufw delete <数字>
更改默认ssh端口
默认的ssh端口号是 22
,如果想改成 1234
端口,请先在VPS后台防火墙里打开 1234
端口
先运行以下命令
sudo ufw allow 1234/tcp comment 'SSH'
修改ssh配置文件
sudo vim /etc/ssh/sshd_config
文件开头就一个 #Port 22
参数。#
表示注释,不生效。
将 #
号去除,然后 22
改为 1234
Port 1234
重启ssh服务生效
sudo service sshd restart
注意:此时不要关闭终端,新开一个窗口用新端口号、非root用户进行ssh登陆测试。如果成功,就可以关闭旧的Shell了。
禁ping
很简单,修改规则文件
sudo vim /etc/ufw/before.rules
外面到本地的访问是由 INPUT
控制的,其中 echo-request
就是ping所采用的类型。因此,只要找到 ok icmp codes for INPUT
下面的记录
# ok icmp codes for INPUT -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT # -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT -A ufw-before-input -p icmp --icmp-type echo-request -j DROP
找到 echo-request
,把 ACCEPT
改成 DROP
。这样外面的机器就无法ping通你的VPS了。
重新加载一下 ufw
以使改动生效
sudo ufw reload
如果你机器安装了1panel,在防火墙里有禁ping按钮,点击即可。
安装Fail2ban(强烈建议)
安装命令
sudo apt install fail2ban -y
运行
sudo service fail2ban start
默认配置:在通过 SSH 尝试登录 6 次失败后,该配置将禁止主机 10 分钟。
DNS和SSL证书
不要设置 DNS 直接指向源站, SSL使用泛域名证书。
发布者:木木,转载请注明出处:https://blog.mmcool.site/4511.html