一、ssh
1.1 ssh 服务安全加固和优化
安全加固配置
1.禁止root用户直接通过ssh远程登录
PermitRootLogin no
2.不使用默认的22端口且定时修改ssh端口
Port 22 #定时修改端口号
3.关闭密码认证使用秘钥认证
PasswordAuthentication No #关闭密码认证
PubkeyAuthentication ye #开启秘钥认证
4.指定可连接的网段
ListenAddress #监听地址指定允许哪些网段远程进来
5.空闲超时自动注销连接
ClientAliveInterval 60
ClientAliveCountMax 0
6.确保ssh开启日志功能且定期分析日志
优化连接速度设置
1.UseDNS no #相当于网络命令的-n选项.
2.GSSAPIAuthentication no #关闭GSS认证.
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.
#屏幕反馈尝试"ssh '192.168.1.173'"即为成功分发公钥
在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-copy-id username@ip 如:ssh-copy-id xiaoming@192.168.1.173
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.
注:ssh username@ip 该命令不加用户名则默认是root用户
二、sudo
sudo(superuser do)是一个在类 Unix 操作系统(如 Linux 和 macOS)中广泛使用的命令,它允许用户以更高的权限(通常是 root 权限)来执行命令。sudo 的设计目的是为了增强系统的安全性,同时简化系统管理员的任务。
2.1 sudo 简介
#授权文件
/etc/sudoers
/etc/sudoers.d
#授权文件语法检查工具
1.检查语法
visudo -c
2.检查指定配置文件语法
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):定义一组命令。
1.用户别名
# 定义用户别名
User_Alias MY_USERS = student, admin
# 使用用户别名
MY_USERS ALL=(ALL) NOPASSWD: /sbin/pidof, /sbin/ifconfig
定义用户别名:MY_USERS 包含用户 student 和 admin。
使用用户别名:MY_USERS 中的用户可以在任何主机上无密码执行 /sbin/pidof 和 /sbin/ifconfig 命令。
2.主机别名 (Host_Alias)
主机别名允许你定义一组主机,并为这些主机设置相同的权限。
# 定义主机别名
Host_Alias MY_HOSTS = server1.example.com, server2.example.com
# 使用主机别名
student MY_HOSTS=(root) ALL
定义主机别名:MY_HOSTS 包含主机 server1.example.com 和 server2.example.com。
使用主机别名:用户 student 可以在 MY_HOSTS 中的任何主机上以 root 用户的身份执行任何命令。
3.命令别名 (Cmnd_Alias)
命令别名允许你定义一组命令,并为这些命令设置相同的权限。
# 定义命令别名
Cmnd_Alias MY_CMDS = /sbin/pidof, /sbin/ifconfig, /usr/bin/systemctl restart nginx
# 使用命令别名
admin ALL=(ALL) NOPASSWD: MY_CMDS
定义命令别名:MY_CMDS 包含命令 /sbin/pidof, /sbin/ifconfig 和 /usr/bin/systemctl restart nginx。
使用命令别名:用户 admin 可以在任何主机上无密码执行 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
示例:
1.授予普通用户xiaoming在etc目录创建文件的权限
xiaoming@ubuntu-2004:/etc$ touch test.txt
touch: cannot touch 'test.txt': Permission denied
xiaoming@ubuntu-2004:/etc$
xiaoming@ubuntu-2004:/etc$ sudo touch test.txt
[sudo] password for xiaoming:
xiaoming is not in the sudoers file. This incident will be reported.
#在未提权之前无法创建文件
#编辑授权文件
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
2.切换到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