前言
去年的时候, 有一篇介绍搭建 ss 服务器的文章, 由于某些众所周知的原因, 被阿里云删除.
后来有段时间使用 VPS, 配合《鸟哥私房菜》, 学习实操 Linux. 当时我以为只要 root 密码够复杂, 就一切 ok, 有一两个月没有太关注安全的问题. 偶然一次使用 lastb 命令, 着实下了一跳, 我的 VPS 每天都有几万次的失败登陆记录. 尝试登陆的 IP, 有俄罗斯, 越南, 巴西.... 基本上地球上所有国家都有来过.
这个时候我才意识到, 如果不做相关的安全方面的措施, 在公网的环境下, 与裸奔无异. 我的 VPS 是 CentOS 7, 以下所有涉及到的配置文件, 相关命令都是在 CentOS 7 以下并且生效了的.
安装 denyhosts
denyhosts 是查询了几万次的失败记录后, 立即安装的. 维基上面的简介
DenyHosts 是针对 SSH 服务器的一个基于日志的入侵预防安全工具, 是用 Python 编写的. 其通过监测身份验证登录日志中失败的登录尝试, 屏蔽这些登录者的 IP 地址, 从而预防对 SSH 服务器的暴力破解.
配置文件路径 / etc/denyhosts.conf, 里面可以配置的项很多, 也有详细说明, 我只修改了通知的用户.
sed -i "s/root@localhost/{用户名}@localhost/g" /etc/denyhosts.conf
效果还是很明显的, 扫描从每天从几万降到了一千左右. 但是这一千左右的失败登陆也是不能忍的.
PS: 把失败的记录基本降为 0 以后, 我考虑通过邮件第一时间通知我, 有人尝试登陆我的主机. 后来再网上在查询, 好像是不直接支持的, 还需要安装专门发送邮件的 postfix, 仅仅为了这个发送邮件, 好像也没有太大的必要. 就放弃了.
使用密钥登陆
维基: RSA 非对称加密算法 我也就了解到, 是大数的质因数分解, 也简单做推算过, 目前还是很安全的. 有兴趣可以去网上找, 李永乐老师的讲解.
在客户端生成公钥和私钥, 然后把公钥上传到服务器, 在 / home/{你的用户名}/.SSH/authorized_keys 文件下追加一条记录. 客户端使用私钥登陆. 相关的教程网上很多, 不做赘述. 需要注意:
RSA 的版本和 SSH 版本, 现在目前系统都是默认 RSA2,SSH2, 并且默认禁用低版本的, 可以忽略;
在生成密钥的时候, 可以不设置密码, 我还是建议可以用一个简单的密码, 不用太复杂;
注意目录 (700) 和文件 (600) 的权限; 追加的时候注意换行和回车;
目前和未来几年内这个算法是安全的, 但是量子计算机破解就是一两分钟, 甚至一秒钟就搞定, 要有这方面意识.
这两天, 阿提亚爵士声称证明了黎曼猜想. 不过看新闻报道, 好像是数学家们认为希望不大. 如果黎曼猜想被证明了的话, 就意味着以素数为基础的所有加密算法都是不安全的.
禁用 root 用户
这个比较简单:
修改配置文件是在:
- /etc/SSH/sshd_config
- ,
搜索
PermitRootLogin yes
, 一般是注释的
#PermitRootLogin yes
; 去掉注释, 改为 no 就可以了.
根据个人需要, 普通用户是否可以使用密码登陆,
PasswordAuthentication
; 我修改的是 yes, 我认为我可能会在临时的电脑上用密码登陆.
重启 SSH:
systemctl restart sshd
更改 SSH 端口
把系统默认的 SSH 端口 22, 改为一个用户自定义的, 1024 以下是系统保留的, 从 1024-65535 是用户使用的.
修改配置文件是在:
- /etc/SSH/sshd_config
- ,
在文件中找到 #Port 22 默认是注释掉的, 然后去掉注释, 改为其他端口号,
千万一定要注意, 记得把自定义的端口, 加入到防火墙中, tcp 协议, 否则可能面临无法登陆了.
重启 SSH:
systemctl restart sshd
禁用 SELinux(Security-Enhanced Linux)
因为这个 VPS 只有我一个人使用, 并且也要时不时的折腾折腾, 所以为了不必要的困扰, 就把这个给禁用了.
修改配置文件是在:
- /etc/selinux/config
- ,
把 SELINUX=enforcing 修改为 SELINUX=disabled, 永久关闭;
setenforce 0 临时关闭,
su,sudo 免密码
我的密码是 VPS 厂商自动生成的, 非常复杂. 为了避免要在使用 root 权限时, 还要再输入密码. 并且既然我的账号都登陆了, 就不应该再次输入密码了.
把用户加入 wheel 组(wheel), 为了免密码
usermod -aG wheel {用户名}
su 免密码, 配置文件 / etc/pam.d/su, 加上这句话
auth sufficient pam_wheel.so trust use_uid
,CentOS7 是注释掉的.
sudo 免密码, 配置文件 / etc/sudoers, 把所在组 wheel 设置
- %wheel ALL=(ALL) NOPASSWD: ALL
- ,
- # wheel 组 sudo 不需要密码
- sed -i 's/^%wheel.*/%wheel ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers
- # wheel 组 su 不需要密码
- sed -i 's/^#auth\s\+sufficient\s\+pam_wheel.so\s\+trust\s\+use_uid/auth sufficient pam_wheel.so trust use_uid/g' /etc/pam.d/su
防火墙设置
一般 Linux 发行版本都是默认开启防火墙的, 并且开启了 22 端口.
使用哪个端口就开哪个, 不用了的端口一定要关闭, 并且使用了 tcp 协议, 只开 tcp 协议.
- firewall-cmd --zone=public --permanent --add-port=${
- my_ssh_port
- }/tcp
- firewall-cmd --reload
禁止 Ping
我之前禁用过一段时间, 因为网络不太稳定, 还需要使用 ping 命令来看看是网络不通, 还是延迟过高. 所以就放开了.
禁用 ICMP 协议./etc/sysctl.conf, 增加
net.ipv4.icmp_echo_ignore_all = 1
,1 禁用, 0 启用;
使配置生效 sysctl -p
别名设置
为了操作自己的 Linux 更加方便, 可以做很多自定义的命令. 好处是很方便, 坏处就是换台机器可能就不会玩了.
shell 文件在 / etc/profile.d / 目录下, 对所有用户生效, 用户登陆执行下面的所有脚本. 注意这个目录下的脚本执行顺序是第一个执行的, 也就是说 alias 会被后面的覆盖,
一些登陆后初始化的脚本, 环境变量设置, 都建议放在这个目录下面 / etc/profile.d/,
PS1PS(Prompt Sign): 是指命令提示符, 当然调整了一下颜色 root@myhost:etc#,
- cat> /etc/profile.d/alias.sh <<-EOF
- PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\\$'
- alias cp='cp -i'
- alias mv='mv -i'
- alias rm='rm -i'
- alias ls='ls --color=auto'
- alias ll='ls -al'
- alias lm='ls -al | more'
- alias dir='dir --color=auto'
- alias vdir='vdir --color=auto'
- alias grep='grep --color=auto'
- alias fgrep='fgrep --color=auto'
- alias egrep='egrep --color=auto'
- alias mkcd='function _mkcd(){ mkdir \$@ && cd \$@; }; _mkcd'
- alias cdl='function _cdl() { cd \$@ && pwd; ls -alF; }; _cdl'
- EOF
结语
这些设置大概是半年前做的了, 断断续续的; 有些遗漏或是不准确的地方欢迎指出;
再修改配置文件的时候, 建议花一些时间看一下里面的注释. 绝大部分配置文件里面, 注释非常清楚, 并且占了文件的大部分内容;
我把以上的内容, 写成了 sh 脚本. 运行过无误, 仅供参考;
一年多的时间博客没有怎么更新, 这几天会记录一下这段时间的积累.
来源: https://www.cnblogs.com/BenAndWang/p/9713080.html