Ubuntu Server 新主机的初步设置

一台新 Ubuntu 服务器的配置过程。

概述

个人比较需要的新主机设置主要包括:

  • 创建新用户并赋予 sodu 权限
  • 配置免密登录(公钥登录)
  • sudo 命令免密码
  • 禁止 root 登录
  • 禁止密码登录

配置过程

以下详述了每一个配置过程。

创建新用户并赋予 sodu 权限

创建之前先检查系统已有的用户,使用以下命令:

1
2
3
4
cat /etc/passwd |cut -d : -f 1
# cut 的参数中
# -d 指定分隔符
# -f 选则分隔之后的 field

创建用户:

1
sudo adduser penn # 相比于 useradd 命令,adduser命令使用交互式方式,更加简单。

之后再查看 cat /etc/passwd

1
penn:x:1002:1003:,,,:/home/penn:/bin/bash

按照 “:” 分隔依次是:用户名,密码,用户 ID,用户组 ID,备注,用户 Home 目录,shell 命令所在目录。

给用户 sudo 权限:

1
sudo usermod -aG sudo penn

配置免密登录(公钥登录)

首先确保客户机上有密钥对,使用 ssh-keygen -t rsa 可以创建密钥对。密钥对可以有多个,不能同名。

方法一(通用方法):

  • 进入 /home/penn 目录
  • 切换到 penn 用户
  • 创建 .ssh 目录: mkdir .ssh
  • 创建文件 authorized_keys, 贴入公钥并保存

之后在客户机上可以尝试使用公钥登录 ssh -i .ssh/my_private_key penn@xx.xx.xx.xx

方法二(需要服务器能够使用密码登录):

执行:ssh-copy-id -i .ssh/my_public_key penn@xx.xx.xx.xx
输入密码即可成功上传公钥。

在客户机上为 IP 指定私钥

修改 ssh 配置文件 ~/.ssh/config ,可以获得以下功能:

  • 当客户机有多个私钥时,可以对 IP(域名)指定私钥,不用每次都写完整路径
  • 可以通过 ssh myserver 这样的别名登录,避免每次输入过长的信息

编辑客户机的 .ssh/config 文件,写入以下配置:

1
2
3
4
5
Host my_server
Hostname XX.XX.XX.XX
Port 22
User penn
IdentityFile ~/.ssh/my_private_key

之后可以通过 ssh my_server 登录机器。

sudo 命令免密码

使用 visudo 命令,编辑配置文件,写入以下行:

1
penn    ALL=(ALL) NOPASSWD:ALL

可以实现 penn 用户使用 sudo 命令不需要输入密码。
还可以通过 visudo 修改用户组设置实现 sudo 用户组使用 sudo 命令都不需要输入密码。见下:

1
2
# 原数据: %sudo ALL=(ALL:ALL) ALL,修改为以下:
%sudo ALL=(ALL:ALL) NOPASSWD: ALL

注意:用户的配置如果放在用户组的配置之前,可能会被用户组的配置覆盖掉。可以将这个配置稍微靠后放。

禁止 root 登录,禁止密码登录,开启公钥登录,更改端口

sudo vim /etc/ssh/sshd_config

1
2
3
4
Port 8022                                   # 端口
PasswordAuthentication no # 禁止密码登录
PubkeyAuthentication yes # 公钥登录
AuthorizedKeysFile .ssh/authorized_keys # 公钥路径

重启服务 sudo systemctl restart sshd

docker 命令免 sudo 前缀

默认情况下,非 root 用户使用 docker 是需要加 sudo 前缀的,可以通过将用户加入 docker 用户组来免输 sudo 使用 docker 命令。

1
2
groups # 查看自己的用户组
sudo usermod -aG docker penn # 加入docker组, 重新登录之后即可生效

用 openssl 创建 CA 证书

写了个脚本完成一下功能:

创建根CA.key, 再根据 根CA.key 自签名得到 根CA.crt
再利用 根CA.crt 对其他证书申请文件(service.csr)进行签发, 得到 service.crt
之后将 service.crt,service.key 分发给服务器,终端用户只需要安装 根CA.crt 即可加密访问 service。

为了节约篇幅,将脚本放置在 github gist 上这里