ssh安全服务和sudo配置

一、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

此条目发表在每周作业, 第六周作业分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注