本文最后更新于 2020 年 4 月 17 日
本文以 CentOS 8 为例,介绍如何对服务器进行初步配置。
本例中,普通用户名采取 sammy
为例,服务器 ip 采取 xx.xxx.xx.xxx
为例,请根据自己的实际情况做相应修改。
创建新用户
登录服务器
本地执行:
1 | ssh [email protected] |
如产生问题,请先查看本文 Troubleshooting 一节。
更改密码
1 | passwd |
更新系统
1 | dnf check-update |
安装必要软件
1 | dnf install sudo vim -y |
创建新用户
服务器上,以 root 用户执行:
1 | adduser sammy |
修改密码:
1 | passwd sammy |
赋予 sudo 权限
服务器上,以 root 用户:
1 | gpasswd -a sammy wheel |
登录此用户
在本地尝试登录此用户:
1 | ssh [email protected] |
设置 SSH 登录
在本地机器上执行:
1 | ssh-keygen -a 1000 -t ed25519 -f ~/.ssh/sammy_host -C "sammy@sammy_host" |
本地生成钥匙对后,将其中的公钥上传到服务器上:
1 | ssh-copy-id -i ~/.ssh/sammy_host.pub [email protected] |
按照提示输入密码。本地建立 config 文件:
1 | vim ~/.ssh/config |
添加如下内容:
1 | Host sammy_host # 别名 |
修改本地 config 文件权限:
1 | chmod 600 ~/.ssh/config |
利用私钥的登录方式,本地执行:
1 | ssh sammy_host |
接下来的所有配置,都请以 sammy
用户的身份进行。
安全设置
强烈建议进行一些必要的安全设置。
禁止 root 登录
服务器编辑 /etc/ssh/sshd_config
文件:
1 | sudo vim /etc/ssh/sshd_config |
将 PermitRootLogin
改为 no
:
1 | PermitRootLogin no |
保存文件后重启服务:
1 | sudo systemctl restart sshd |
更改 SSH 端口
服务器编辑 /etc/ssh/sshd_config
文件:
1 | sudo vim /etc/ssh/sshd_config |
将 Port
改为自定义端口,本例为 12333
:
1 | Port 12333 |
设置 firewalld
先检查一下 firewalld 是否正在运行中:
1 | sudo firewall-cmd --state |
查看默认的 zone
:
1 | sudo firewall-cmd --get-default-zone |
查看 public
中的全部设置:
1 | sudo firewall-cmd --zone=public --list-all |
允许新的 SSH 端口:
1 | sudo firewall-cmd --permanent --zone=public --add-port=12333/tcp |
安装 semanage
首先查询哪个包提供了 semanage
命令:
1 | dnf provides /usr/sbin/semanage |
根据输出,安装:
1 | sudo dnf install policycoreutils-python-utils -y |
在 SELinux 中允许新的 SSH 端口:
1 | sudo semanage port -l | grep ssh |
1 | sudo semanage port -a -t ssh_port_t -p tcp 12333 |
1 | sudo semanage port -l | grep ssh |
重启 SSH 服务
1 | sudo systemctl restart sshd |
重新登陆后,禁止旧的默认端口:
1 | sudo firewall-cmd --permanent --zone=public --remove-service=ssh |
本地更改
本地编辑 ssh 的 config 文件,做相应修改:
1 | Host sammy_host |
启用二步验证
服务器安装 Google Authenticator
1 | sudo dnf install google-authenticator qrencode -y |
配置 Google Authenticator
1 | google-authenticator |
将出现一些问题:
1 | Do you want authentication tokens to be time-based (y/n) |
y
回答完此问题后,会出现二维码、Key,还有备用码,用手机的 Google Authenticator 扫描二维码或手动键入 Key,即可添加二步验证码,另外保存好备用码到一个安全的地方,以防手机丢失。同时,程序将提示输入手机上显示的验证码,以供核对。如产生问题,则应考虑服务器时间是否准确,请先查看本文 Troubleshooting 一节。
1 | Do you want me to update your "~/.google_authenticator" file (y/n) |
y
1 | Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) |
y
1 | By default, a new token is generated every 30 seconds by the mobile app. |
n
1 | If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) |
y
移动配置文件:
1 | mv .google_authenticator .ssh/ |
更新 context
:
1 | restorecon -Rv .ssh/ |
修改 sshd_config 文件
1 | sudo vim /etc/ssh/sshd_config |
找到 ChallengeResponseAuthentication
将其值改为 yes
,结果如下所示:
1 | # Change to yes to enable challenge-response passwords (beware issues with |
在此文件末尾添加一行:
1 | AuthenticationMethods publickey,keyboard-interactive |
修改 PAM 设置
修改配置文件:
1 | sudo vim /etc/pam.d/sshd |
注释掉 auth substack password-auth
一行,结果如下所示:
1 | # auth substack password-auth |
在此文件末尾添加一行:
1 | auth required pam_google_authenticator.so secret=~/.ssh/.google_authenticator |
重启 sshd 服务
1 | sudo systemctl restart sshd |
本地尝试登录
1 | ssh user@serverip |
显示:
1 | Verification code: |
输入二步验证码即可。
优化设置
调整 swap 空间
创建交换文件:
1 | sudo fallocate -l 1G /swapfile # 或者 sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576 |
使用交换文件:
1 | sudo mkswap /swapfile |
查看效果:
1 | sudo swapon --show |
开机自动挂载:
1 | sudo cp /etc/fstab /etc/fstab.bak |
编辑 /etc/fstab
删掉之前的 swap 挂载行:
1 | sudo vim /etc/fstab |
安装 rsync
本地和服务器均安装 rsync ,方便日后文件传输:
1 | sudo dnf install rsync -y |
启用 BBR
启用之前,先检查是否已经启用了。
1 | sudo sysctl net.ipv4.tcp_congestion_control |
如果没有启用(无 bbr 字样),开始设置启用 BBR:
1 | echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf |
Troubleshooting
SSH 超时
由于防火墙的原因,SSH 链接会因超时自动断开,为防止这一现象,可在本地 config 中添加设置:
1 | vim ~/.ssh/config |
1 | Host * |
Too many authentication failures
这可能是由于你在本地拥有多个 ssh 私钥导致的,如不做配置,ssh 默认将优先尝试所有 IdentityFile ,而服务端在你连续做了 6 次尝试后将禁止你的再次尝试。
解决此问题的方法有两个。
修改本地配置
在进行首次尝试登录之前,在本地的 ~/.ssh/config
中添加:
1 | Host * |
更改服务器的设置
如果已经报了这个错误,那么你将无法通过第一个方法解决这个问题,不过你仍可以按照第一种方法进行设置,以避免后续再发生类似问题。
以 root
用户登录到服务器,修改 /etc/ssh/sshd_config
文件,将 MaxAuthTries
去掉注释并改为更高的数值,例如 100 。
1 | MaxAuthTries 100 |
重启 sshd
服务:
1 | systemctl restart sshd |
当你处理好这个问题之后(比如添加了 private key 的登录方式后不会有此困扰),记得把这个设置再次注释掉,并重启服务。
服务器时间不准
请查阅 Linux 服务器时间同步问题 一文。
References
Enable EPEL Repository on RHEL 8 / CentOS 8 Linux
Linux Troubleshooting – semanage command not found in CentOS 7/8 And RHEL 7/8
How to Fix ‘semanage command’ Not Found Error in CentOS/RHEL
Changing SSH Port on CentOS/RHEL 7/8 & Fedora 31/30/29 With SELinux Enforcing
How to Change SSH Port in Linux
How To Install and Enable SSH Server on CentOS 8
Introduction to FirewallD on CentOS
How to Configure and Manage the Firewall on CentOS 8
How To Set Up Two factor (2FA) Authentication for SSH on CentOS / RHEL 8/7
Secure SSH with Google Authenticator Two-Factor Authentication on CentOS 7
error: Failed to update secret file “/home/testuser1/.google_authenticator”: Permission denied
Use One-Time Passwords for Two-Factor Authentication with SSH on CentOS 7