ssh、rsync、sudo实现授权

实现基于密钥的登录方式

在客户端生成密钥对

1ssh-keygen -t rsa [-P 'password'] [-f "~/.ssh/id_rsa"]
2
3ssh-keygen #一直敲回撤,就是密码为空 即可

把公钥文件传输至远程服务器对应用户的家目录

1ssh-copy-id [-i [identity_file]] [user@]host
2# 把客户端公钥放到 远程的 authorized_keys 

重设私钥口令

1ssh-keygen -p

sshpass

输入密码登录

1yum -y install sshpass
2
3sshpass -pxxxxx123 ssh  -o StrictHostKeyChecking=no root@www.crblog.cc "df -h"

ssh服务器配置

服务器端:sshd

服务器端的配置文件: /etc/ssh/sshd_config

服务器端的配置文件帮助:man 5 sshd_config

常用参数:

 1Port 22  #生产建议修改
 2ListenAddress ip
 3LoginGraceTime 2m
 4PermitRootLogin yes #默认ubuntu不允许root远程ssh登录
 5StrictModes yes  #检查.ssh/文件的所有者,权限等
 6MaxAuthTries  6   #pecifies the maximum number of authentication 
 7attempts permitted per connection. Once the number of failures reaches half this 
 8value, additional failures are logged. The default is 6.
 9MaxSessions 10     #同一个连接最大会话
10PubkeyAuthentication yes   #基于key验证
11PermitEmptyPasswords no   #空密码连接
12PasswordAuthentication yes  #基于用户名和密码连接
13GatewayPorts no
14ClientAliveInterval 10 #单位:秒
15ClientAliveCountMax 3 #默认3
16UseDNS yes #提高速度可改为no
17GSSAPIAuthentication yes #提高速度可改为no
18MaxStartups  #未认证连接最大值,默认值10
19Banner /path/file
20#以下可以限制可登录用户的办法:
21AllowUsers user1 user2 user3
22DenyUsers user1 user2 user3
23AllowGroups g1 g2
24DenyGroups g1 g2

设置 ssh 空闲 60s 自动注销

1Vim /etc/ssh/sshd_config
2ClientAliveInterval  60
3ClientAliveCountMax  0
4Service sshd restart
5#注意:新开一个连接才有效

解决ssh登录缓慢的问题

1vim /etc/ssh/sshd_config
2UseDNS no
3GSSAPIAuthentication no
4systemctl restart sshd

在 ubuntu 上启用 root 远程ssh登录

1修改sshd服务配置文件
2vim /etc/ssh/sshd_config 
3#PermitRootLogin prohibit-password 注释掉此行
4PermitRootLogin yes 修改为下面形式
5systemctl restart sshd

rsync

rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传 输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包

注意:通信两端主机都需要安装 rsync 软件

1rsync -av /etc  server1:/tmp/ #复制目录和目录下文件
2rsync -av /etc/ server1:/tmp/ #只复制目录下文件
3rsync -av hugo-blog root@xxxx:/opt/
4rsync -auv --delete /data/test 10.0.0.7:/data
5rsync -auv --progress --bwlimit=5120 --delete /data/test
6rsync -e "ssh -p 2221" blhy-230411.sql ubuntu@xxx:   # ssh 端口非21 

常用选项:

 1-n 模拟复制过程
 2-v 显示详细过程
 3-r 递归复制目录树
 4-p 保留权限
 5-t 保留修改时间戳
 6-g 保留组信息
 7-o 保留所有者信息
 8-l 将软链接文件本身进行复制(默认)
 9-L 将软链接文件指向的文件复制
10-z 压缩,节约网络带宽
11-a 存档,相当于-rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
12--delete 源数据删除,目标数据也自动同步删除
13--progress 显示进度
14--bwlimit=5120 #限速以KB为单位,5120表示5MB

sudo实现授权

sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性

在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先 告知超级用户的密码。sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得 权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信 息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为 “sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自 己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运 行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。 由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如 Ubuntu、Mac OS X等

sudo特性:

  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

授权规则配置文件:

1/etc/sudoers
2/etc/sudoers.d

安全编辑授权规则文件和语法检查工具

1#检查语法
2sudo visudo -c
3#检查指定配置文件语法
4sudo visudo -f /etc/sudoers.d/test

sudo命令

 1ls -l /usr/bin/sudo
 2sudo -i -u wang 切换身份功能和 su 相似,但不一样,sudo必须提前授权,而且要输入自已的密码
 3sudo [-u user] COMMAND
 4-V 显示版本信息等配置信息
 5-u user 指定代表的用户,默认为root
 6-l,ll 列出用户在主机上可用的和被禁止的命令
 7-v 再延长密码有效期限5分钟,更新时间戳
 8-k 清除时间戳(1970-01-01),下次需要重新输密码
 9-K 与-k类似,还要删除时间戳文件
10-b 在后台执行指令
11-p 改变询问密码的提示符号
12示例:-p "password on %h for user %p: "

sudo 授权规则配置

配置文件格式说明:/etc/sudoers, /etc/sudoers.d/

配置文件中支持使用通配符 glob

1? 任意单一字符
2* 匹配任意长度字符
3[wxc] 匹配其中一个字符
4[!wxc] 除了这三个字符的其它字符
5\x 转义 
6[[alpha]] 字母

配置文件规则有两类

  • 1、别名定义:不是必须的
  • 2、授权规则:必须的

sudoers 授权规则格式:

1用户 登入主机=(代表用户) 命令
2user host=(runas) command
1user: 运行命令者的身份
2host: 通过哪些主机
3(runas):以哪个用户的身份
4command: 运行哪些命令

示例

1root ALL=(ALL) ALL

vagrant 中vagrant 用户 sudo 文件

1Defaults:vagrant !fqdn
2Defaults:vagrant !requiretty
3vagrant ALL=(ALL) NOPASSWD: ALL

sudoers的别名

 1User和runas: 
 2 username
 3 #uid
 4 %group_name
 5 %#gid
 6 user_alias|runas_alias
 7host:
 8 ip或hostname
 9 network(/netmask) 
10 host_alias
11command:
12 command name
13 directory /sbin/
14 sudoedit
15 Cmnd_Alias

sudo别名有四种类型:

  • User_Alias
  • Runas_Alias
  • Host_Alias
  • Cmnd_Alias

别名定义:

1Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5

实战案例

1Student ALL=(ALL)  ALL
2%wheel  ALL=(ALL)  ALL
3
4student ALL=(root)  /sbin/pidof,/sbin/ifconfig
5%wheel ALL=(ALL) NOPASSWD: ALL

案例

 1[root@centos7 ~]#groupmems -a wang -g wheel
 2[root@centos7 ~]#id wang
 3uid=1000(wang) gid=1000(wang) groups=1000(wang),10(wheel)
 4[root@centos7 ~]#su - wang
 5Last login: Fri Jan 29 19:32:37 CST 2021 on pts/0
 6#下面方式失败
 7[wang@centos7 ~]$sudo echo 1.2.3.4 www.test.com >> /etc/hosts
 8-bash: /etc/hosts: Permission denied
 9#用下面方式可以实现
10#bash -c 将后面所有信字符串作为整体进行sudo
11#注意""必须加,否则只授权 >> 前面的命令sudo 
12[wang@centos7 ~]$sudo bash -c "echo 1.2.3.4 www.test.com >> /etc/hosts"
13[wang@centos7 ~]$cat /etc/hosts
14127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4 
15::1  localhost localhost.localdomain localhost6 localhost6.localdomain6
161.2.3.4 www.test.com

案例

1User_Alias NETADMIN= netuser1,netuser2
2Cmnd_Alias NETCMD = /usr/sbin/ip,/usr/sbin/ifconfig
3NETADMIN ALL=(root) NETCMD

案例

1User_Alias SYSADER=wang,mage,%admins 
2User_Alias DISKADER=tom
3Host_Alias SERS=www.xxx.com,172.16.0.0/24
4Runas_Alias OP=root 
5Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod 
6Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 
7SYSADER SERS=  SYDCMD,DSKCMD 
8DISKADER ALL=(OP) DSKCMD
1User_Alias ADMINUSER = adminuser1,adminuser2
2Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root
3ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
1Defaults:wang runas_default=tom
2wang ALL=(tom,jerry) ALL
3
4
5wang$ sudo cmd #默认代表tom执行cmd
6wang$ sudo -u jerry cmd