Ubuntu (Debian) 服务器的初始化配置

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 登录
    9. 1.9. 设置开机自动登录
  2. 2. 安全设置
    1. 2.1. 禁止 root 登录
    2. 2.2. 禁止密码登录
    3. 2.3. 更改 SSH 端口
    4. 2.4. 使用 fail2ban
    5. 2.5. 使用 ufw
    6. 2.6. 启用二步验证
      1. 2.6.1. 服务器安装 Google Authenticator
      2. 2.6.2. 配置 Google Authenticator
      3. 2.6.3. 修改 sshd_config 文件
      4. 2.6.4. 接下来有两个不同的步骤
        1. 2.6.4.1. 方案一
        2. 2.6.4.2. 方案二
      5. 2.6.5. 重启 sshd 服务
      6. 2.6.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. 更改服务器的设置
  5. 5. References

本文最后更新于 2019 年 5 月 24 日


本文以 Ubuntu 18.04 为例,介绍如何对服务器进行初步配置,本文同样完全适用于 Debian 9 系统。

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


创建新用户

登录服务器

本地执行:

1
ssh [email protected]

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

更改密码

1
passwd

更新系统

1
apt update && apt full-upgrade -y && apt autoremove -y

安装必要软件

1
apt install sudo vim -y

创建用户

服务器上,以 root 用户执行:

1
adduser sammy

根据提示填写信息。

赋予 sudo 权限

服务器上,以 root 用户:

1
usermod -aG sudo sammy

登录此用户

在本地尝试登录此用户:

1
ssh [email protected]

设置 SSH 登录

在本地机器上执行:

1
ssh-keygen -a 1000 -t ed25519 -f ~/.ssh/sammy_ubuntu -C "[email protected]"

本地生成钥匙对后,将其中的公钥上传到服务器上:

1
ssh-copy-id -i ~/.ssh/sammy_ubuntu.pub [email protected]

按照提示输入密码。本地建立 config 文件:

1
vim ~/.ssh/config

添加如下内容:

~/.ssh/config
1
2
3
4
5
Host sammy_host # 别名
HostName localhost # 替换 localhost 为服务器 ip 地址
Port 22 # 端口,稍后会进行修改
User sammy # 用户名
IdentityFile ~/.ssh/sammy_ubuntu # 私钥文件

修改本地 config 文件权限:

1
chmod 600 ~/.ssh/config

利用私钥的登录方式,本地执行:

1
ssh sammy_host

接下来的所有配置,都请以 sammy 用户的身份进行。

设置开机自动登录

有时需要某些 sammy 用户的服务在开机启动,然而当 sammy 没有登录时,这些服务并不会随开机启动。但可以使用 getty 来进行设置。服务器上:

1
sudo systemctl edit [email protected]

之后会自动打开文本编辑器,粘贴如下内容,注意替换其中的 sammy

1
2
3
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin sammy --noclear %I $TERM

保存文件。服务器执行:

1
sudo systemctl enable [email protected]

然后可以重启机器:

1
sudo reboot

或者重启服务并查看状态:

1
2
sudo systemctl restart [email protected]
sudo systemctl status [email protected]

安全设置

强烈建议进行一些必要的安全设置。

禁止 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

禁止密码登录

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

1
sudo vim /etc/ssh/sshd_config

PasswordAuthentication 改为 no

/etc/ssh/sshd_config
1
PasswordAuthentication 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

保存文件后重启服务:

1
sudo systemctl restart sshd

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

~/.ssh/config
1
2
3
4
5
Host sammy_host
HostName localhost
Port 12333 # 修改了端口
User sammy
IdentityFile ~/.ssh/sammy_ubuntu

使用 fail2ban

在服务器上安装:

1
sudo apt update && sudo apt install fail2ban -y

启用:

1
sudo systemctl enable fail2ban

编辑配置文件:

1
sudo vim /etc/fail2ban/jail.local

这是一个新文件,添加如下内容:

/etc/fail2ban/jail.local
1
2
3
4
5
6
7
8
9
10
11
[DEFAULT]
# Ban hosts for one hour:
bantime = 43200
findtime = 600
maxretry = 1

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

重启 fail2ban

1
sudo systemctl restart fail2ban

下面分别是查看 fail2ban 状态的两条命令:

1
2
sudo fail2ban-client status
sudo fail2ban-client status sshd

使用 ufw

安装 ufw :

1
sudo apt update && sudo apt install ufw -y

允许 SSH 登录:

1
sudo ufw allow 12333

启用防火墙:

1
sudo ufw enable

查看状态:

1
sudo ufw status

启用二步验证

服务器安装 Google Authenticator

1
sudo apt update && sudo apt install libpam-google-authenticator -y

配置 Google Authenticator

1
google-authenticator

将出现一些问题:

1
Do you want authentication tokens to be time-based (y/n)

y

回答完此问题后,会出现二维码、Key,还有备用码,用手机的 Google Authenticator 扫描二维码或手动键入 Key,即可添加二步验证码,另外保存好备用码到一个安全的地方,以防手机丢失。

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

修改 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

接下来有两个不同的步骤

两个方案的优劣留待有大佬在评论区发表见解。

方案一

之后修改配置文件:

1
sudo vim /etc/pam.d/sshd

注释掉 @include common-auth 一行,结果如下所示:

/etc/pam.d/sshd
1
2
# Standard Un*x authentication.
#@include common-auth

在此文件末尾添加一行:

/etc/pam.d/sshd
1
auth required pam_google_authenticator.so
方案二

之后修改配置文件:

1
sudo vim /etc/pam.d/sshd

在文件顶端添加一行:

/etc/pam.d/sshd
1
auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so

重启 sshd 服务

1
sudo systemctl restart sshd

本地尝试登录

1
ssh [email protected]

显示:

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 apt update && sudo apt install rsync -y

启用 BBR

启用之前,先检查是否已经启用了。

1
sudo sysctl net.ipv4.tcp_congestion_control

如果没有启用(无 bbr 字样),再检查:

1
lsmod | grep bbr

如果输出没有 bbr 字样,执行:

1
2
sudo modprobe tcp_bbr
echo "tcp_bbr" | sudo tee -a /etc/modules-load.d/modules.conf

准备工作完成,开始设置启用 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 的登录方式后不会有此困扰),记得把这个设置再次注释掉,并重启服务。

References

How can I get autologin at startup working on Ubuntu Server 16.04.1?

Automatically Login on Debian 9.2.1 Command Line

getty - ArchWiki

Configure SSH to use two-factor authentication

Trying to get SSH with public key (no password) + google authenticator working on Ubuntu 14.04.1

SSH two-factor authentication: How to enable on your VPS

Two factor linux authentication using Google Authenticator

How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04

how to stop your firewall from timing out your ssh session

How to Keep Alive SSH Sessions

SSH aborts with Too many authentication failures

How to recover from “Too many Authentication Failures for user root”