在使用云服务器的过程中,我们一般会做一些配置来提高云服务器的安全,下面开始操作:

1. 修改 root 密码

  1. 修改 root 密码;

    1
    passwd root # 修改 root 用户密码
  2. 修改 root 用户名(不推荐,sudo 提权时会找不到 root 用户)。

    1
    2
    vim /etc/passwd # 修改第一行第一个 root 为新的用户名
    vim /etc/shadow # 修改第一行第一个 root 为新的用户名

2. 添加一个普通管理员

  1. 查看 root 账户所属权限组;

    1
    id root # 查看 root 用户所属权限组(root,对应的 gid 为 0)

    误区更新:把普通用户加入 root 权限组并不会具有 root 权限

  2. 创建一个普通管理员用户;

    1
    useradd -g wheel -m username 

    另一种方式(不推荐):

    1
    useradd -o -u 0 -g 0 -m username
    1
    2
    3
    4
    5
    6
    7
    # -m 指定在 /home 下创建用户主目录,
    # -g 指定初始组(可以是 gid 或者 组名)
    # -o 必须和 -u 一起使用,指定 uid,并且 uid 可重复
    # 上面命令的意思是,创建一个名为 username 的用户,同时
    # 在 /home 目录下创建该用户主目录,指定该用户的 uid = 0,gid = 0,这代表该用户具有 root 用户
    # 的所有权限,一般只指定 gid = 10,也就是设置用户的初始组为 wheel,这时虽然具有 root 权限,但
    # 是进行某些敏感操作时(比如查看系统文件,日志等)还是需要使用 sudo su 命令切换到 root 用户。

    权限管理小贴士:

    • root 用户的 uid = 0,拥有最高权限,属于 root 权限组(gid = 0);

    • wheel 权限组 gid = 10,普通管理员组,拥有部份 root 权限,可通过 sudo 命令提升权限执行 root 操作(部份操作需要输入密码)。wheel 组主要存在于 Redhat 系发行版(RHEL、Fedora、CentOS)中,Debian 系发行版(ubuntu、kali、…)中对应的为 sudo 权限组;

    • sudo 授权对应的配置文件为/etc/sudoers,你可以在其中添加如下配置使得 test 用户和 wheel 权限组内用户使用 sudo 提权时不需要输入密码;

      1
      2
      3
      test    ALL=(ALL)       ALL
      %wheel ALL=(ALL) NOPASSWD: ALL
      # 授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
    • 新建的用户如果不指定初始组,默认初始组名称就是用户名称,用户具有初始组(-g)和附加组(-G)所有权限。

  3. 设置密码;

    1
    passwd username #设置密码

3. 禁用 root 用户登录

WARNING:先确保上面新创建的用户可以 SSH 登录,不然只有联系服务器提供商解决问题。

  1. 第一种;

    1
    2
    vim /etc/ssh/sshd_config # 设置 PermitRootLogin no,禁止 root 用户 ssh 登录
    systemctl restart sshd # 重启 ssh 服务,不要关闭当前终端!!!,最好先使用新用户测试能否远程 ssh 连接

  2. 第二种(推荐)。

    1
    sudo passwd -l root

4. 其他相关命令

4.1 查看登录和权限

1
2
3
4
5
who # 查看系统当前所有的登录用户
w # 查看系统当前所有的登录用户及正在执行的操作
who am i # 等同于 who -m
whoami # 查看当前有效用户(比如登录后使用 su 切换了用户)
id # 查看当前有效用户及所属组信息

4.2 权限组相关

1
2
3
4
5
6
groups # 查看当前用户所属组
sudo groupdel [OPTIONS] GROUP # 删除组(组下没有用户)
sudo groupadd [OPTIONS] GROUP # 添加组
sudo usermod -g root test # 修改 test 初始组为 root
sudo usermod -G root test # 添加 test 的附加组为 root(用户具有初始组和附加组所有权限)
sudo gpasswd root -d test # 将 test 移出 root 组

4.3 配置相关

1
2
3
4
5
sudo cat /etc/passwd # 查看所有用户的 UID,GID,主目录,默认 shell
sudo cat /etc/shadow # 查看用户名和 md5 加密后的密码
sudo cat /etc/sudoers # 查看 sudo 授权配置
sudo cat /etc/profile # 系统配置
sudo cat /etc/groups # 查看用户权限情况

4.4 密码相关

1
2
3
4
sudo passwd -d test # 删除密码
sudo passwd -l root # 禁止 root 用户登录(原理:生成错误的密码与输入的密码匹配),不影响 SSH 密钥登录
sudo passwd -u root # 解锁 root 登录
sudo passwd -S root # 检查密码状态

4.5 删除用户

1
sudo userdel -rf test # 删除test用户同时删除test用户主目录及文件

4.6 文件授权

1
2
lsattr [OPTION][文件或文件夹]
chattr [RVf][+-=属性][文件或文件夹]

常用方式:

1
chattr +ia /home/test/1.txt # 即使 root 用户也无权修改或删除

5. 修改 SSH 端口

  1. 修改/etc/ssh/sshd_config配置文件;

    1
    vim /etc/ssh/sshd_config # 设置 Port 为 5000,对应的云服务器防火墙或者安全组把原来的 22 端口 tcp 连接删除,新增一个 5000 端口
  2. 重启 SSHD 服务;

    1
    systemctl restart sshd

    阿里云和腾讯云默认都关闭了防火墙,相应的做了其他措施来保证服务器安全,我们只需要防火墙或者安全组开放对应的端口即可,而不是频繁的使用 firewalld 命令来开放端口。

6. 使用 SSL VPN 连接(推荐)

配置教程:https://i4t.com/5253.html

关键词:Open VPN

  1. 切换到 root 用户(否则密钥文件无法被读取,无法建立连接),执行以下命令下载一键安装脚本并执行;

    1
    wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

    由于 github 做了下载限制,一般 wget 是获取不到的,所以建议先下载再以 root 用户执行脚本

    1
    2
    >sudo su
    >bash openvpn-install.sh
  2. 根据脚本提示输入(基本全部默认);

  3. 下载 Open VPN Windows 客户端;

    官网地址(需要梯子):https://openvpn.net/community-downloads/

    注意:不要选 Open VPN 官方 V3 板本的 windows 客户端,不方便查看连接日志,很难排查连接问题

  4. 服务器开放 VPN 端口(默认 1194,UDP方式);

  5. Windows 客户端导入上面下载的配置文件ssh_client.ovpn

  6. 点击连接,可以查看到连接日志;

    如果这个弹框过一会儿消失并且右下角的小电脑显示为绿色表示连接成功

  7. 连接成功后,可以使用服务器内网 IP 访问 nacos 测试;

    1
    http://10.4.0.18:8848/nacos/index.html
  8. 使用tracert -d命令跟踪路由查看是否走的 VPN 通道连接;

    1
    tracert -d www.baidu.com

    可以看到第一跳地址已经变为服务器内网网关,而不是本机的网关。

  9. 现在可以关闭服务器的其他端口,只开放 SSH、VPN、HTTP、HTTPS 端口;

    注意:如果 Docker 已经配置了 CA 认证,需要开放 Docker 端口才能连接,因为使用 CA 签署公钥时指定了 Docker 公网 IP,而走 VPN 通道必然是使用内网 IP 访问 Docker,连接时这两个 IP 对不上就连接失败,如果不嫌麻烦就重新配置 Docker CA 认证。或者取消认证,因为走 VPN 通道就没有必要开放 Docker 端口,就只有自己可以连接。

7. 使用 SSH 密钥连接

推荐阅读:https://zhuanlan.zhihu.com/p/587082161

  1. 本地生成公钥和私钥;

    1
    ssh-keygen -t ed25519 -C "create by yourname@qq.com"

    通过man ssh-keygen可以发现支持的加密算法很多,但一般选择 rsa 或者 ed25519 ,rsa 对 SSH 工具兼容好,ed25519 更安全,加密解密更快。

  2. 使用ssh-copy-id命令拷贝公钥到服务器上;

    1
    ssh-copy-id -i /c/Users/immas/.ssh/id_ed25519.pub -p 5000 username@$HOST # -p 指定 ssh 端口
  3. 远程连接服务器。

    1
    ssh -p 5000 username@$HOST
  4. 配置 SSH 客户端免密登录;

    我使用的是 Bitvise,也可以选择 Xshell

    • Initial method选择publickey

    • 点击Client key manager,在弹出界面导入生成的私钥文件;

    • 导入私钥后关闭窗口,选择这个私钥并登录;

    • 连接测试。

8. 记录所有用户操作日志

  1. 修改/etc/profile文件,在文件末尾追加如下内容;

    1
    vim /etc/profile
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #记录系统操作日志开始
    USER=`whoami`
    USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
    if [ "$USER_IP" = "" ]; then
    USER_IP=`hostname`
    fi
    if [ ! -d /var/log/history ]; then
    mkdir /var/log/history
    chmod 777 /var/log/history
    fi
    if [ ! -d /var/log/history/${LOGNAME} ]; then
    mkdir /var/log/history/${LOGNAME}
    chown -R ${LOGNAME}:${LOGNAME} /var/log/history/${LOGNAME}
    chmod 300 /var/log/history/${LOGNAME}
    fi
    export HISTSIZE=4096
    DT=`date +"%Y%m%d_%H:%M:%S"`
    export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"
    chmod 600 /var/log/history/${LOGNAME}*history* 2>/dev/null
    # 记录系统操作日志结束

    生成的日志文件在 /var/log/history,需要 root 权限查看

  2. 配置文件立即生效。

    1
    source /etc/profile

参考文章: