博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用sudo安全管理系统
阅读量:6515 次
发布时间:2019-06-24

本文共 7980 字,大约阅读时间需要 26 分钟。

我们都知道在实际生产环境中一定不可随便使用管理员权限登录的,哪我们一旦使用到管理员权限时该怎么办??

   有人会说使用su命令呀,直接切换不就行了嘛。这位友人你说的不错,但是如果你线下有上百上千台服务器需要你管理你该怎么办啊?又有人会说让别人帮助你啊,话虽如此但是这位友人不要忘记哦这样需要你将管理员密码告诉他们或给他们赋予管理员的权限,这样的后果你是懂得的!!这时又有人说了直接使用sudo用户不就行了嘛,对对这位友人一语点醒命中人啊;那么下面我们一起了解一下sudo命令吧??

1:概念认知

sudo是linux系统管理指令也就是权限管理机制,也就是使一般用户不需要知道root的密码即可获得权限。首先root将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权;在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以root的权限运行。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。

2:配置文件

  • Sudo的配置文件是sudoers文件它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers;权限是440并且还有隐藏权限可使用如下命令进行查看:

1
2
[root@station144 ~]
# lsattr /etc/sudoers
-------------e- 
/etc/sudoers               
#e表示禁止修改的,可用chattr查看

  • 查看解析配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@station144 ~]
# cat /etc/sudoers
……  这些部分一省略。
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)   ALL              
#表示:哪个用户在哪些主机上以谁的命令执行什么权限
%zhao   ALL=(root)  
/usr/sbin/useradd    
#表示zhao这个组内的所有成员都可执行/usr/sbin/useradd这个命令权限。
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
# %wheel    ALL=(ALL)   ALL
## Same thing without a password
# %wheel    ALL=(ALL)   NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

通过查看配置文件可以了解到:

   某用户获取权限的方式: who where=(whom) command   哪个用户在哪些主机上以谁的命令执行什么命令。

   某用户组获取权限的方式 %GroupName  where=(whom) command  哪个用户组在哪些主机上以谁的命令执行什么命令。注意:此命令定义之后会立即生效。


  • 编辑配置文件

命令:visudo

   注意:编辑sudo的配置文件/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法格式,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。


3:语法格式

sudo [-bhHpV][-s ][-u <用户>][指令]

    或

   sudo [-klv]

   参数

  -b  在后台执行指令。

  -h  显示帮助。

  -H  将HOME环境变量设为新身份的HOME环境变量。

  -k  结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。系统默认sudo有效期为5分钟

  -l  列出目前用户可执行与无法执行的指令,也就是可以查看自己使用哪个用户的身份执行那些特殊权限。

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

  -s  执行指定的shell。

  -u <用户>  以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份。

  -v  延长密码有效期限5分钟。

  -V  显示版本信息。

   -S   从标准输入流替代终端来获取密码

4:示例演练

   定义一个用户(jerry)使其拥有添加用户的特殊权限,并进行创建用户操作。

  1)创建用户jerry并为其添加密码

1
2
3
4
[root@station144 ~]
# useradd jerry
[root@station144 ~]
# echo "jerry" | passwd --stdin jerry
Changing password 
for 
user jerry.
passwd
: all authentication tokens updated successfully

  2)修改/etc/sudoers配置文件

1
2
3
4
5
6
7
8
9
10
[root@station144 ~]
# visudo
……        
#内容省略
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
jerry   ALL=(root)    
/usr/sbin/useradd      
#添加权限,这里的/usr/sbin/useradd表示普通用户执行时必须使用全路径,可以使用which 命令查看哦!
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
……         
#内容省略
  
#保存退出

  3)切换用户测试

   jerry直接登陆服务器(或使用su - jerry)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[jerry@station144 ~]$ 
sudo 
–l              
#查看此用户具有的特殊权限
We trust you have received the usual lecture from the 
local 
System
Administrator. It usually boils down to these three things:
    
#1) Respect the privacy of others.
    
#2) Think before you type.
    
#3) With great power comes great responsibility.
[
sudo
] password 
for 
jerry:              
#这里需要输入密码,以确认终端机前的是该用户本人
Matching Defaults entries 
for 
jerry on this host:
    
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY
    
HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS
", env_keep+="
MAIL PS1 PS2 QTDIR
    
USERNAME LANG LC_ADDRESS LC_CTYPE
", env_keep+="
LC_COLLATE LC_IDENTIFICATION
    
LC_MEASUREMENT LC_MESSAGES
", env_keep+="
LC_MONETARY LC_NAME LC_NUMERIC
    
LC_PAPER LC_TELEPHONE
", env_keep+="
LC_TIME LC_ALL LANGUAGE LINGUAS
    
_XKB_CHARSET XAUTHORITY", secure_path=
/sbin
\:
/bin
\:
/usr/sbin
\:
/usr/bin
User jerry may run the following commands on this host:
    
(root) 
/usr/sbin/useradd      
#jerry可以以管理员的身份管理useradd
1
2
3
4
5
6
7
8
9
10
11
12
[jerry@station144 ~]$ 
sudo 
/usr/sbin/useradd 
user2     
#添加user2用户
[jerry@station144 ~]$ 
tail 
/etc/passwd           
#查看添加结果
postfix:x:89:89::
/var/spool/postfix
:
/sbin/nologin
rpcuser:x:29:29:RPC Service User:
/var/lib/nfs
:
/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:
/var/lib/nfs
:
/sbin/nologin
pulse:x:496:495:PulseAudio System Daemon:
/var/run/pulse
:
/sbin/nologin
puppet:x:52:52:Puppet:
/var/lib/puppet
:
/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:
/var/empty/sshd
:
/sbin/nologin
tcpdump:x:72:72::/:
/sbin/nologin
jerry:x:500:500::
/home/jerry
:
/bin/bash
user1:x:501:501::
/home/user1
:
/bin/bash
user2:x:502:502::
/home/user2
:
/bin/bash          
#添加成功

 4)查看日志文件

   由于普通用户没有查看日志的权限所以需要切换回管理员执行:

1
2
3
4
5
6
7
[root@station144 ~]
# tail /var/log/secure
Aug 13 08:57:11 station144 sshd[2987]: Accepted password 
for 
root from 172.16.254.58 port 51571 ssh2
Aug 13 08:57:11 station144 sshd[2987]: pam_unix(sshd:session): session opened 
for 
user root by (uid=0)
Aug 13 09:05:01 station144 
sudo
:    jerry : TTY=pts
/1 
; PWD=
/home/jerry 
; USER=root ; COMMAND=list               
#jerry以管理员的权限执行了list命令
Aug 13 09:42:45 station144 
sudo
:    jerry : TTY=pts
/1 
; PWD=
/home/jerry 
; USER=root ; COMMAND=
/usr/sbin/useradd 
user2    
#以管理员的权限执行了useradd
Aug 13 09:42:45 station144 
useradd
[3197]: new group: name=user2, GID=502
Aug 13 09:42:45 station144 
useradd
[3197]: new user: name=user2, UID=502, GID=502, home=
/home/user2
, shell=
/bin/bash

   结:以后可以使用此命令日志查看主机是否遭到入侵攻击,或者查看某用户登录进来并使用特殊权限执行错误指令等等。所以我们要实时监控此文件的动向。

  5)结束密码有效期,重新认证添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[jerry@station144 ~]$ 
sudo 
–k            
#结束密码有效期
[jerry@station144 ~]$ 
sudo 
/usr/sbin/useradd 
user3    
#创建用户
[
sudo
] password 
for 
jerry:             
#重新验证用户
[jerry@station144 ~]$ 
tail 
/etc/passwd       
#结果显示
rpcuser:x:29:29:RPC Service User:
/var/lib/nfs
:
/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:
/var/lib/nfs
:
/sbin/nologin
pulse:x:496:495:PulseAudio System Daemon:
/var/run/pulse
:
/sbin/nologin
puppet:x:52:52:Puppet:
/var/lib/puppet
:
/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:
/var/empty/sshd
:
/sbin/nologin
tcpdump:x:72:72::/:
/sbin/nologin
jerry:x:500:500::
/home/jerry
:
/bin/bash
user1:x:501:501::
/home/user1
:
/bin/bash
user2:x:502:502::
/home/user2
:
/bin/bash
user3:x:503:503::
/home/user3
:
/bin/bash


5:扩展优化部分

sudoers文件支持使用别名对同类对象进行分组:组名必须使用全大写字母,使用逗号将同类对象命令隔开。

 Host_Alias:主机别名

     User_Alias:用户别名

     Runas_Alias:在哪些主机以谁的身份运行  的别名

     Cmnd_Alias:命令别名

1
2
3
4
5
Cmnd_Alias USERADMIN = 
/usr/sbin/useradd
/usr/sbin/usermod
/usr/sbin/userdel  
#定义命令别名
jerry   ALL=(root)    USERADMIN   
#这样就定义了jerry可以执行别名中的所有命令
Host_Alias USERHOSTS = 172.16.0.0
/16
,127.0.0.0
/8
,192.168.0.0
/24    
#定义主机别名
jerry   USERHOSTS=(root)    USERADMIN
……
  • 设置不允许某用户执行某操作?

1
jerry ALL=(root) 
/usr/bin/passwd 
[a-zA-Z]*,!
/usr/bin/passwd 
root     
#jerry可以以root的权限更改密码但是不包括更改root的密码。
  • 支持以正则表达式或通配符的形式进行通配

1
2
%operator ALL = 
/bin/cat 
/var/log/messages
*
  
更多通配情况可参考
man 
sudoers
  • 怎么设置执行特权命令时不需输入密码

1
jerry   ALL=(root)      
/usr/sbin/useradd
,NOPASSWD: 
/usr/sbin/userdel
,
/usr/sbin/groupdel
,PASSWD: 
/usr/sbin/usermod
,
/usr/sbin/groupmod

   解析:这里的/usr/sbin/useradd 操作时必须使用密码;/usr/sbin/userdel, /usr/sbin/groupdel操作时可以不使用密码(跟在其后的所有操作一律不使用密码);/usr/sbin/usermod, /usr/sbin/groupmod 操作时还是要输入密码;还有PASSWD和NOPASSWD不可定义于别名中哦!

1
2
3
4
5
6
7
8
9
10
11
[root@station144 ~]
# visudo                  #添加
jerry   ALL=(root)      
/usr/sbin/useradd
,NOPASSWD: 
/usr/sbin/userdel
,
/usr/sbin/groupdel
,PASSWD: 
/usr/sbin/usermod
,
/usr/sbin/groupmod
[jerry@station144 ~]$ 
sudo 
/usr/sbin/useradd 
user5      
#切换执行
[
sudo
] password 
for 
jerry:
[jerry@station144 ~]$ 
sudo 
–k         
#结束密码有效期
[jerry@station144 ~]$ 
sudo 
/usr/sbin/useradd 
user6
[
sudo
] password 
for 
jerry:
[jerry@station144 ~]$ 
sudo 
-k
[jerry@station144 ~]$ 
sudo 
/usr/sbin/userdel 
user6
[jerry@station144 ~]$ 
sudo 
/usr/sbin/usermod 
user5 -a –G magedu
[
sudo
] password 
for 
jerry:

小结:sudo命令虽然知识量不算大;但是在生产环境中实用性很强;所以要多加了解熟练应用。感觉好者请右下角!

本文转自 z永 51CTO博客,原文链接:http://blog.51cto.com/pangge/1275911

转载地址:http://rspfo.baihongyu.com/

你可能感兴趣的文章
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
设计模式 之 访问者模式
查看>>
JAVA Collections框架
查看>>
进制转换
查看>>
html与html5的一些区别
查看>>
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
mysqldump 备份命令使用中的一些经验总结
查看>>
Linux下MySql安装配置方法总结
查看>>
ArrayList底层实现
查看>>
【转载】Java程序设计入门 (二)
查看>>
单词最近距离
查看>>
程序猿知道英语词汇
查看>>
数据存储(两)--SAX发动机XML记忆(附Demo)
查看>>