问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SSH安全服务配置和sudo权限管理详解

创作时间:
作者:
@小白创作中心

SSH安全服务配置和sudo权限管理详解

引用
1
来源
1.
https://lyon.zone/index.php/2024/09/29/ssh%E5%AE%89%E5%85%A8%E6%9C%8D%E5%8A%A1%E5%92%8Csudo%E9%85%8D%E7%BD%AE/

SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地远程登录和执行命令。sudo(superuser do)是一个在类 Unix 操作系统中广泛使用的命令,它允许用户以更高的权限(通常是 root 权限)来执行命令。本文将详细介绍SSH的安全配置和sudo的权限管理。

一、SSH

1.1 SSH服务安全加固和优化

SSH服务的安全性和性能可以通过以下配置进行优化:

  1. 禁止root用户直接通过SSH远程登录

    PermitRootLogin no
    
  2. 不使用默认的22端口且定时修改SSH端口

    Port 22 #定时修改端口号
    
  3. 关闭密码认证使用秘钥认证

    PasswordAuthentication No #关闭密码认证
    PubkeyAuthentication yes   #开启秘钥认证
    
  4. 指定可连接的网段

    ListenAddress #监听地址指定允许哪些网段远程进来
    
  5. 空闲超时自动注销连接

    ClientAliveInterval 60
    ClientAliveCountMax 0
    
  6. 确保SSH开启日志功能且定期分析日志

1.2 SSH免密认证原理

OpenSSH免密认证基于公钥加密技术,通过一对非对称加密秘钥来实现。以下是基本原理:

  1. 首先在客户端生成一对密钥(ssh-keygen)
  2. 并将客户端的公钥ssh-copy-id 拷贝到服务端
  3. 当客户端再次发送一个连接请求,包括IP、用户名
  4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串。
  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

1.3 免密认证实现过程


  1. 客户端生成秘钥对

    root@ssh-client:~# ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): #回车
    Enter passphrase (empty for no passphrase): #回车
    Enter same passphrase again: #回车
    Your identification has been saved in /root/.ssh/id_rsa
    Your public key has been saved in /root/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:xgco6yhGbfnmeFfcNlmz9ZPVdkpdPd0VsHb0JGt9+kw root@ssh-client
    The key's randomart image is:
    +---[RSA 3072]----+
    |             .ooO|
    |       .      o**|
    |    . . .    oooB|
    |  . .o . .  .+ooB|
    | . +.   S o o.=oE|
    |. .o.  . + = ..*.|
    |... .o  . . .   +|
    |..  +. .         |
    |   ....          |
    +----[SHA256]-----+
    
    root@ssh-client:~# ls .ssh/
    authorized_keys  id_rsa  id_rsa.pub
    
  2. 分发秘钥至server端

    root@ssh-client:~# ssh-copy-id 192.168.1.173
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host '192.168.1.173 (192.168.1.173)' can't be established.
    ECDSA key fingerprint is SHA256:XF2WytrueEY6X/gU0JPDyV/WhgxlhQyN2CmnEk0VL6k.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes #输入yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@192.168.1.173's password: #输入server端root密码
    Number of key(s) added: 1
    Now try logging into the machine, with:   "ssh '192.168.1.173'"
    and check to make sure that only the key(s) you wanted were added.
    

    在server端查看authorized_keys文件可以看到client的公钥

    root@ssh-server:~# cat .ssh/authorized_keys 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCxPihowhM/yX3VkcgN9eVtA+UAtlswtYU9pvX+/9t0YTzZ9xYLg70g3lw/Lk385yxfVxqTXz12mMkk00K7vHb7Lj1D0l3qW9QAVU+5C6caOOW90/bgpL8VCRzEnMEtbWwm7scdjgEuKJvsgsMV+PR5awb765ldKutTTwtdIQOXFIUnpOTyhcry7qs80FZoZzXnUo1Togvt0TYrZ5gt2vipRv7vdn9s2ge0+6K3DAGvGxObcKaJasFYoSjiMTxqI85oACpY8bDx1D+g+I3Lv9HIfNu/vXcX9m86jHYZ5Mr63DtTCm+1fZ6yRl/Xp5F+g5MrpH+KtrphPCgrnHRLbgMS3sJHHerDD9UzRIBFZZRQeQ1gdIZWQDrIkmNkI2aAeRlGxki8rawoQoOQxaKundwDeCV/V33zrRNuC3jYVNzLsiq/1a9tEuzhDyZNxIJtGAMquEUpBLEXJzN0E1SrBI1jRsTdSuhe5Fy0eUDsAVc8fLoEMaRcFcr0zNouYsoFWI8= root@ssh-client
    
  3. SSH登录server

    root@ssh-client:~# ssh root@192.168.1.173
    Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-81-generic x86_64)
    ......
    Last login: Sun Sep 29 11:29:39 2024 from 192.168.1.115
    root@ssh-server:~# exit
    logout
    Connection to 192.168.1.173 closed.
    

二、sudo

sudo(superuser do)是一个在类 Unix 操作系统(如 Linux 和 macOS)中广泛使用的命令,它允许用户以更高的权限(通常是 root 权限)来执行命令。sudo 的设计目的是为了增强系统的安全性,同时简化系统管理员的任务。

2.1 sudo简介

  • 授权文件

  • /etc/sudoers

  • /etc/sudoers.d

  • 授权文件语法检查工具

  • visudo -c:检查语法

  • visudo -f /etc/sudoers.d/test:检查指定配置文件语法

  • sudo命令简介

  • -V:显示版本信息等配置信息

  • -u user:指定代表的用户,默认为root

  • -l,ll:列出用户在主机上可用的和被禁止的命令

  • -v:再延长密码有效期限5分钟,更新时间戳

  • -k:清除时间戳(1970-01-01),下次需要重新输密码

  • -K:与-k类似,还要删除时间戳文件

  • -b:在后台执行指令

  • -p:改变询问密码的提示符号

2.2 授权规则配置

授权规则格式:

用户 登入主机=(代表用户) 命令
user host=(runas) command

说明:

  • user:运行命令者的身份
  • host:通过哪些主机
  • (runas):以哪个用户的身份
  • command:运行哪些命令

别名解释

在 sudoers 文件中,别名(Aliases)是一种定义用户、主机或命令的别名的方法,这样可以使配置更加简洁和易于管理。使用别名可以让你定义一组用户、主机或命令,并在 sudoers 文件的其他地方引用这些别名,从而避免重复定义。

别名的分类

sudoers 文件支持三种类型的别名:

  • 用户别名 (User_Alias):定义一组用户。
  • 主机别名 (Host_Alias):定义一组主机。
  • 命令别名 (Cmnd_Alias):定义一组命令。

用户别名

# 定义用户别名
User_Alias MY_USERS = student, admin
# 使用用户别名
MY_USERS ALL=(ALL) NOPASSWD: /sbin/pidof, /sbin/ifconfig

主机别名 (Host_Alias)

# 定义主机别名
Host_Alias MY_HOSTS = server1.example.com, server2.example.com
# 使用主机别名
student MY_HOSTS=(root) ALL

命令别名 (Cmnd_Alias)

# 定义命令别名
Cmnd_Alias MY_CMDS = /sbin/pidof, /sbin/ifconfig, /usr/bin/systemctl restart nginx
# 使用命令别名
admin ALL=(ALL) NOPASSWD: MY_CMDS

使用别名的注意事项

  1. 位置:别名定义通常放在 sudoers 文件的顶部,以便在整个文件中引用。
  2. 语法:别名定义的语法为 Alias_Type Alias_Name = item1, item2, ...
  3. 引用:在 sudoers 文件的其他地方引用别名时,直接使用别名名称即可。

完整示例

# 定义用户别名
User_Alias MY_USERS = student, admin
# 定义主机别名
Host_Alias MY_HOSTS = server1.example.com, server2.example.com
# 定义命令别名
Cmnd_Alias MY_CMDS = /sbin/pidof, /sbin/ifconfig, /usr/bin/systemctl restart nginx
# 使用用户别名
MY_USERS ALL=(ALL) NOPASSWD: MY_CMDS
# 使用主机别名
student MY_HOSTS=(root) ALL
# 其他配置
%wheel ALL=(ALL) NOPASSWD: ALL

示例:授予普通用户xiaoming在etc目录创建文件的权限

  1. 在未提权之前无法创建文件

    xiaoming@ubuntu-2004:/etc$ touch test.txt
    touch: cannot touch 'test.txt': Permission denied
    
  2. 编辑授权文件

    root@ubuntu-2004:~# cat /etc/sudoers.d/xiaoming 
    xiaoming    ALL=(root) /usr/bin/touch
    
  3. 修改授权文件权限为0440

    root@ubuntu-2004:~# chmod 0440 /etc/sudoers.d/xiaoming
    
  4. 执行语法检查

    root@ubuntu-2004:~# visudo -c
    /etc/sudoers: parsed OK
    /etc/sudoers.d/README: parsed OK
    /etc/sudoers.d/xiaoming: parsed OK
    
  5. 切换到xiaoming账号在etc目录下创建文件 test.txt

    root@ubuntu-2004:~# su - xiaoming
    xiaoming@ubuntu-2004:~$ cd /etc/
    xiaoming@ubuntu-2004:/etc$ sudo touch test.txt
    [sudo] password for xiaoming: 输入密码
    
  6. 检查文件是否存在

    xiaoming@ubuntu-2004:/etc$ ls test.txt
    test.txt
    
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号