用户权限管理-sudo


:Mr.zhou  阅读: 1,916 次

  在安装完CentOS操作系统后,默认只有一个 root 超级用户。在 linux 系统中,root 具有至高无上的权利,它的权利大到可以把自己删除!(userdel –f root)。所以要慎重是否把 root 密码告诉其他人。

  那么问题来了,不能把 root 密码给其他人,但是其他人必须要有 root 权限才能完成工作,这个问题要怎样解决?让普通用户以root权限的运行命令的方法有以下三种:

  1、可以使用权限位,将普通用户需要以 root 权限来执行的命令设置 setuid setgid位。弊:系统中的其他用户都能以 root 权限来执行此命令。不安全,不建议使用。

  2、使用 su – root 。当普通用户需要具有 root 权限时,使用 su 命令切换到 root 用户,在切换时需要输入 root 的密码。敝:该普通用户已经知道了 root 的密码。不安全,不建议使用。

  3、使用 sudo 。在使用前 root 通过修改配置文件,让指定的用户能以 root 权限运行指定的命令。在使用 sudo 时需要输入的是普通用户自己的密码而不是 root 的密码。利:可以对用户和命令进行授权限制,不需要 root 密码。用户和命令的权限授权粒度细,推荐使用。

  用户权限管理 sudo,涉及到的命令:useradd visudo sudo

  useradd : 添加系统账户。

  visudo : 编辑 sudo 的配置文件 /etc/sudoers ,在编辑完成退出时进行语法检查。也可以直接使用 vi 编辑 /etc/sudoers 编辑完后手动使用 visudo –c 来进行检查。

  sudo : 在普通用户下需要使用 root 权限执行命令时在要执行的命令前加上 sudo 。根据不同的用户配置可能需要用户输入自己的密码。

  sudo 执行命令流程:

sudo

  跟 sudo 相关的主要配置文件有:/etc/sudo.conf 、/etc/sudoers 。

  一般情况下对用户进行相应的 sudo 授权时,直接在 root 用户下输入 visudo 进行编辑。visudo 在编辑完配置文件后会对其进行语法检查。

  下面讲解 sudo 的核心配置文件 /etc/sudoers。

  为用户授权的语法格式:

user    		MACHINE		=	COMMANDS
授权的用户名		主机名或IP地址	=	可以执行的命令

  配置文件中已经有一条写好的用户授权,root    ALL=(ALL)       ALL 。含义为:允许 root 用户在任何地点以任何用户的身份执行任何命令。(ALL)意思为 可以以任何用户的身份执行,所以(user1)为只能以 user1 的身份运行。

  在配置文件中可以使用 别名对用户、主机、命令进行定义。定义的别名必须大写。配置文件中的注释部分已经给出了一些定义的别名。

  主机别名:可以是主机名或IP地址。

  Host_Alias     FILESERVERS = fs1, fs2

  Host_Alias     MAILSERVERS = smtp, smtp2

  Host_Alias     FTPSEVER = 192.168.100.251, 192.168.100.252

  用户别名:此别名不经常使用,可以使用组名,以 %GroupName 的形式代替,方便用户的管理。

  User_Alias ADMINS = jsmith, mikem

  命令别名:以下是常用的命令别名。

  网络 Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

  服务配置 Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

  更新 locate数据库 Cmnd_Alias LOCATE = /usr/bin/updatedb

  存储 Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount,/bin/umount

  委派授权 Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

  进程 Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

  驱动 Cmnd_Alias DRIVERS = /sbin/modprobe

  以下为操作实例,把实例看懂了,也就把 sudo 搞懂了。

  默认的配置文件:

[root@MrZhou ~]# grep -Ev '^$|#' /etc/sudoers
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
[root@MrZhou ~]# 

  1、创建一个普通用户使其只能使用 sudo 对网络进行重启。

[root@MrZhou ~]# useradd netadmin1
[root@MrZhou ~]# echo "123456"|passwd --stdin netadmin1
Changing password for user netadmin1.
passwd: all authentication tokens updated successfully.
[root@MrZhou ~]#

[netadmin1@MrZhou ~]$ whoami
netadmin1
[netadmin1@MrZhou ~]$ /etc/init.d/network restart
[netadmin1@MrZhou ~]$ echo $?
4
[netadmin1@MrZhou ~]$ 

[root@MrZhou ~]# echo "netadmin1 ALL=(ALL) /etc/init.d/network restart">>/etc/sudoers
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]# tail -1 /etc/sudoers
netadmin1 ALL=(ALL) /etc/init.d/network restart
[root@MrZhou ~]#

[netadmin1@MrZhou ~]$ sudo /etc/init.d/network restart
[sudo] password for netadmin1:

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 netadmin1: 
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
                                                           [  OK  ]
[netadmin1@MrZhou ~]$ echo $?
0
[netadmin1@MrZhou ~]$ 

  2、创建一个用户 filefinder 使其可以通过 sudo 查找查看任何文件。要求使用命令别名。

[root@MrZhou ~]# useradd filefinder
[root@MrZhou ~]# echo "123456"|passwd --stdin filefinder
Changing password for user filefinder.
passwd: all authentication tokens updated successfully.
[root@MrZhou ~]# pwd
/root
[root@MrZhou ~]# mkdir filedir
[root@MrZhou ~]# for i in `seq -f stu%02g 1 10`;do echo $i>/root/filedir/$i;done;
[root@MrZhou ~]# tree filedir
filedir
├── stu01
├── stu02
├── stu03
├── stu04
├── stu05
├── stu06
├── stu07
├── stu08
├── stu09
└── stu10

0 directories, 10 files
[root@MrZhou ~]# 
[root@MrZhou ~]# cat filedir/stu10 
stu10
[root@MrZhou ~]# 
[root@MrZhou ~]# echo -e "Cmnd_Alias FILEFIND = `which --skip-alias tree`,`which --skip-alias ls`,`which --skip-alias find`,`which --skip-alias which`,`which --skip-alias whereis`,`which --skip-alias cat`,`which --skip-alias stat` \nfilefinder ALL=(ALL) FILEFIND">>/etc/sudoers
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]# tail -2 /etc/sudoers
Cmnd_Alias FILEFIND = /usr/bin/tree,/bin/ls,/bin/find,/usr/bin/which,/usr/bin/whereis,/bin/cat,/usr/bin/stat 
filefinder ALL=(ALL) FILEFIND
[root@MrZhou ~]# 

[filefinder@MrZhou ~]$ whoami
filefinder
[filefinder@MrZhou ~]$ sudo tree /root
/root
├── anaconda-ks.cfg
├── filedir
│   ├── stu01
│   ├── stu02
│   ├── stu03
│   ├── stu04
│   ├── stu05
│   ├── stu06
│   ├── stu07
│   ├── stu08
│   ├── stu09
│   └── stu10
├── install.log
├── install.log.syslog
└── services

1 directory, 14 files
[filefinder@MrZhou ~]$ 
[filefinder@MrZhou ~]$ sudo find / -type f -name stu10
/root/filedir/stu10
[filefinder@MrZhou ~]$ sudo cat `sudo find / -type f -name stu10`   
stu10
[filefinder@MrZhou ~]$ 

  3、新建两个用户 user1 user2 使用用户别名进行权限配置,使其能使用 cat 命令查看任何文件。

[root@MrZhou ~]# echo user{1,2}|tr " " "\n"|xargs -n1 useradd
[root@MrZhou ~]# echo "123456"|passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@MrZhou ~]# echo "123456"|passwd --stdin user2
Changing password for user user2.
passwd: all authentication tokens updated successfully.
[root@MrZhou ~]# 

[user1@MrZhou ~]$ cat /root/filedir/stu10
cat: /root/filedir/stu10: Permission denied
[user1@MrZhou ~]$ sudo cat /root/filedir/stu10
[sudo] password for user1: 
user1 is not in the sudoers file.  This incident will be reported.
[user1@MrZhou ~]$ 

[root@MrZhou ~]# echo -e "User_Alias CATUSER = user1,user2\nCATUSER ALL=(ALL) `which --skip-alias cat`">>/etc/sudoers
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]# tail -2 /etc/sudoers
User_Alias CATUSER = user1,user2
CATUSER ALL=(ALL) /bin/cat
[root@MrZhou ~]#  

[user1@MrZhou ~]$ sudo cat /root/filedir/stu10
[sudo] password for user1: 
stu10
[user1@MrZhou ~]$

[user2@MrZhou ~]$ sudo cat /root/filedir/stu01
[sudo] password for user2: 
stu01
[user2@MrZhou ~]$

  4、使用 %groupname 进行权限授权。

[root@MrZhou ~]# groupadd -g 10000 diskadmin
[root@MrZhou ~]# id user1
uid=502(user1) gid=502(user1) groups=502(user1)
[root@MrZhou ~]# groupmems -g diskadmin -a user1
[root@MrZhou ~]# id user1
uid=502(user1) gid=502(user1) groups=502(user1),10000(diskadmin)
[root@MrZhou ~]# 

[user1@MrZhou ~]$ fdisk -l
[user1@MrZhou ~]$ fdisk -l /etc/sda

[root@MrZhou ~]# echo -e "%diskadmin ALL=(ALL) `which --skip-alias fdisk`">>/etc/sudoers
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]# tail -1 /etc/sudoers
%diskadmin ALL=(ALL) /sbin/fdisk
[root@MrZhou ~]# 

[user1@MrZhou ~]$ sudo fdisk -l
[sudo] password for user1: 

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00025055
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26          91      524288   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3              91        1306     9755648   83  Linux
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[user1@MrZhou ~]$ 

[root@MrZhou ~]# groupmems -l -g diskadmin
user1 
[root@MrZhou ~]# 

[user2@MrZhou ~]$ whoami
user2
[user2@MrZhou ~]$ fdisk -l
[user2@MrZhou ~]$ 
[user2@MrZhou ~]$ sudo fdisk -l
[sudo] password for user2: 
Sorry, user user2 is not allowed to execute '/sbin/fdisk -l' as root on MrZhou.z-dig.com.
[user2@MrZhou ~]$ 

[root@MrZhou ~]# groupmems -g diskadmin -a user2
[root@MrZhou ~]# groupmems -l -g diskadmin
user1  user2 
[root@MrZhou ~]# 

[user2@MrZhou ~]$ sudo fdisk -l
[sudo] password for user2: 

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00025055
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26          91      524288   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3              91        1306     9755648   83  Linux
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[user2@MrZhou ~]$ 

  5、在1的基础上,更改配置,在重启网卡时不提示输入密码。

[netadmin1@MrZhou ~]$ sudo /etc/init.d/network restart
[sudo] password for netadmin1: 

[root@MrZhou ~]# grep "netadmin1" /etc/sudoers
netadmin1 ALL=(ALL) /etc/init.d/network restart

[root@MrZhou ~]# sed -ir 's#^netadmin1.*$#netadmin1 ALL=\(ALL\) NOPASSWD:/etc/init.d/network restart#g' /etc/sudoers  
[root@MrZhou ~]# grep "netadmin1" /etc/sudoers
netadmin1 ALL=(ALL) NOPASSWD:/etc/init.d/network restart
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]# 

[netadmin1@MrZhou ~]$ sudo -k
[netadmin1@MrZhou ~]$ sudo /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
                                                           [  OK  ]
[netadmin1@MrZhou ~]$ 

  6、对 sudo 的执行进行日志记录。

[root@MrZhou ~]# echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
[root@MrZhou ~]# visudo -c
/etc/sudoers: parsed OK
[root@MrZhou ~]#

[root@MrZhou ~]# ls /var/log|grep sudo
[root@MrZhou ~]#

[netadmin1@MrZhou ~]$ sudo /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
                                                           [  OK  ]
[netadmin1@MrZhou ~]$

[root@MrZhou ~]# ls /var/log|grep sudo
sudo.log
[root@MrZhou ~]# cat /var/log/sudo.log
Jun  7 16:47:18 : netadmin1 : TTY=pts/1 ; PWD=/home/netadmin1 ; USER=root ;
    COMMAND=/etc/init.d/network restart
[root@MrZhou ~]# 

转载请注明原文链接:http://www.z-dig.com/user-rights-management-sudo.html



正文部分到此结束