SSH安全服务配置和sudo权限管理详解
SSH安全服务配置和sudo权限管理详解
SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地远程登录和执行命令。sudo(superuser do)是一个在类 Unix 操作系统中广泛使用的命令,它允许用户以更高的权限(通常是 root 权限)来执行命令。本文将详细介绍SSH的安全配置和sudo的权限管理。
一、SSH
1.1 SSH服务安全加固和优化
SSH服务的安全性和性能可以通过以下配置进行优化:
禁止root用户直接通过SSH远程登录
PermitRootLogin no
不使用默认的22端口且定时修改SSH端口
Port 22 #定时修改端口号
关闭密码认证使用秘钥认证
PasswordAuthentication No #关闭密码认证 PubkeyAuthentication yes #开启秘钥认证
指定可连接的网段
ListenAddress #监听地址指定允许哪些网段远程进来
空闲超时自动注销连接
ClientAliveInterval 60 ClientAliveCountMax 0
确保SSH开启日志功能且定期分析日志
1.2 SSH免密认证原理
OpenSSH免密认证基于公钥加密技术,通过一对非对称加密秘钥来实现。以下是基本原理:
- 首先在客户端生成一对密钥(ssh-keygen)
- 并将客户端的公钥ssh-copy-id 拷贝到服务端
- 当客户端再次发送一个连接请求,包括IP、用户名
- 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串。
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
1.3 免密认证实现过程
客户端生成秘钥对
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
分发秘钥至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
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
使用别名的注意事项
- 位置:别名定义通常放在 sudoers 文件的顶部,以便在整个文件中引用。
- 语法:别名定义的语法为 Alias_Type Alias_Name = item1, item2, ...
- 引用:在 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目录创建文件的权限
在未提权之前无法创建文件
xiaoming@ubuntu-2004:/etc$ touch test.txt touch: cannot touch 'test.txt': Permission denied
编辑授权文件
root@ubuntu-2004:~# cat /etc/sudoers.d/xiaoming xiaoming ALL=(root) /usr/bin/touch
修改授权文件权限为0440
root@ubuntu-2004:~# chmod 0440 /etc/sudoers.d/xiaoming
执行语法检查
root@ubuntu-2004:~# visudo -c /etc/sudoers: parsed OK /etc/sudoers.d/README: parsed OK /etc/sudoers.d/xiaoming: parsed OK
切换到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: 输入密码
检查文件是否存在
xiaoming@ubuntu-2004:/etc$ ls test.txt test.txt