CentOS 服务器的初始配置

Contents
  1. 1. 创建新用户
    1. 1.1. 登录服务器
    2. 1.2. 更改密码
    3. 1.3. 更新系统
    4. 1.4. 安装必要软件
    5. 1.5. 创建新用户
    6. 1.6. 赋予 sudo 权限
    7. 1.7. 登录此用户
    8. 1.8. 设置 SSH 登录
  2. 2. 安全设置
    1. 2.1. 禁止 root 登录
    2. 2.2. 更改 SSH 端口
    3. 2.3. 设置 firewalld
    4. 2.4. 安装 semanage
    5. 2.5. 重启 SSH 服务
    6. 2.6. 本地更改
    7. 2.7. 启用二步验证
      1. 2.7.1. 服务器安装 Google Authenticator
      2. 2.7.2. 配置 Google Authenticator
      3. 2.7.3. 修改 sshd_config 文件
      4. 2.7.4. 修改 PAM 设置
      5. 2.7.5. 重启 sshd 服务
      6. 2.7.6. 本地尝试登录
  3. 3. 优化设置
    1. 3.1. 调整 swap 空间
    2. 3.2. 安装 rsync
    3. 3.3. 启用 BBR
  4. 4. Troubleshooting
    1. 4.1. SSH 超时
    2. 4.2. Too many authentication failures
      1. 4.2.1. 修改本地配置
      2. 4.2.2. 更改服务器的设置
    3. 4.3. 服务器时间不准
  5. 5. References

本文最后更新于 2020 年 4 月 17 日


本文以 CentOS 8 为例,介绍如何对服务器进行初步配置。

本例中,普通用户名采取 sammy 为例,服务器 ip 采取 xx.xxx.xx.xxx 为例,请根据自己的实际情况做相应修改。


创建新用户

登录服务器

本地执行:

1
ssh [email protected]

如产生问题,请先查看本文 Troubleshooting 一节。

更改密码

1
passwd

更新系统

1
2
3
4
5
dnf check-update
dnf update
dnf clean all
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf config-manager --set-enabled PowerTools

安装必要软件

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

添加如下内容:

~/.ssh/config
1
2
3
4
5
Host sammy_host    # 别名
HostName xx.xxx.xx.xxx # 替换 xx.xxx.xx.xxx 为服务器 ip 地址
Port 22 # 端口,稍后会进行修改
User sammy # 用户名
IdentityFile ~/.ssh/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

/etc/ssh/sshd_config
1
PermitRootLogin no

保存文件后重启服务:

1
sudo systemctl restart sshd

更改 SSH 端口

服务器编辑 /etc/ssh/sshd_config 文件:

1
sudo vim /etc/ssh/sshd_config

Port 改为自定义端口,本例为 12333

/etc/ssh/sshd_config
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
2
sudo firewall-cmd --permanent --zone=public --add-port=12333/tcp
sudo firewall-cmd --reload

安装 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
2
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --reload

本地更改

本地编辑 ssh 的 config 文件,做相应修改:

~/.ssh/config
1
2
3
4
5
Host sammy_host
HostName xx.xxx.xx.xxx
Port 12333 # 修改了端口
User sammy
IdentityFile ~/.ssh/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
2
3
4
5
6
7
8
9
10
By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n)

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 ,结果如下所示:

/etc/ssh/sshd_config
1
2
3
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

在此文件末尾添加一行:

/etc/ssh/sshd_config
1
AuthenticationMethods publickey,keyboard-interactive

修改 PAM 设置

修改配置文件:

1
sudo vim /etc/pam.d/sshd

注释掉 auth substack password-auth 一行,结果如下所示:

/etc/pam.d/sshd
1
# auth       substack     password-auth

在此文件末尾添加一行:

/etc/pam.d/sshd
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
2
sudo fallocate -l 1G /swapfile # 或者 sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576
sudo chmod 600 /swapfile

使用交换文件:

1
2
sudo mkswap /swapfile
sudo swapon /swapfile

查看效果:

1
2
sudo swapon --show
free -h

开机自动挂载:

1
2
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

编辑 /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
2
3
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Troubleshooting

SSH 超时

由于防火墙的原因,SSH 链接会因超时自动断开,为防止这一现象,可在本地 config 中添加设置:

1
vim ~/.ssh/config
~/.ssh/config
1
2
Host *
ServerAliveInterval 30

Too many authentication failures

这可能是由于你在本地拥有多个 ssh 私钥导致的,如不做配置,ssh 默认将优先尝试所有 IdentityFile ,而服务端在你连续做了 6 次尝试后将禁止你的再次尝试。

解决此问题的方法有两个。

修改本地配置

在进行首次尝试登录之前,在本地的 ~/.ssh/config 中添加:

~/.ssh/config
1
2
Host *
IdentitiesOnly yes

更改服务器的设置

如果已经报了这个错误,那么你将无法通过第一个方法解决这个问题,不过你仍可以按照第一种方法进行设置,以避免后续再发生类似问题。

root 用户登录到服务器,修改 /etc/ssh/sshd_config 文件,将 MaxAuthTries 去掉注释并改为更高的数值,例如 100 。

/etc/ssh/sshd_config
1
MaxAuthTries 100

重启 sshd 服务:

1
systemctl restart sshd

当你处理好这个问题之后(比如添加了 private key 的登录方式后不会有此困扰),记得把这个设置再次注释掉,并重启服务。

服务器时间不准

请查阅 Linux 服务器时间同步问题 一文。


References

使用CentOS / RHEL 8 进行初始服务器设置

CentOS 8 安装后的系统初始化

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

How to Boost Linux Server Internet Speed with TCP BBR

Mastodon