Linux入门真经-025使用sudo进行管理授权

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/syaziou/article/details/82148474

前面我们说到,有时候服务器是需要多人管理的。比如说你是老大,啥事都是你说了算。那么你应该对服务器拥有全部的权限。但是假如来了俩实习生,把root密码告诉他们就不太合适了,但是总得给他们放通部分命令的执行权限,好让他们能干点活。

这个时候sudo就派上用场了。

sudo可以让获得授权的用户以另外一个用户的身份(包括root)运行指定的命令。这样不仅可以减轻root管理员的负荷,也避免了root密码的大量流传。接下来就来介绍sudo,并举一些例子帮助你理解。

管理员可以通过修改/etc/sudoer文件,来设置哪些用户能够执行哪些命令。由于这个文件有着特殊的语法格式,因此如果你不按照它的语法编写的话可能会导致sudo无法使用。有一个命令可以修改sutoer文件并且检查语法格式,他就是visudo,visudo同时也调用了vi编辑器的接口,因此你可以使用vi的各个用法来使用visudo。

首先我们可以看一下sudoer的内容。里面有大量的注释,熟悉英语的朋友可以自行参阅,这里我先过滤注释和空行,对默认配置进行简要说明,免得输出太多让人眼花。

[root@localhost ~]# cat /etc/sudoers | grep-Ev "^$|^[#]"

Defaults  !visiblepw

Defaults   always_set_home

Defaults   match_group_by_gid

Defaults   env_reset

Defaults   env_keep =  "COLORS DISPLAYHOSTNAME HISTSIZE KDEDIR LS_COLORS"

Defaults   env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESSLC_CTYPE"

Defaults   env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENTLC_MESSAGES"

Defaults   env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPERLC_TELEPHONE"

Defaults   env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSETXAUTHORITY"

Defaults   secure_path = /sbin:/bin:/usr/sbin:/usr/bin

rootALL=(ALL)       ALL

%wheel    ALL=(ALL)ALL

前面几行无需关心,让我们把目光放在最后两行。

他的含义是:

root(谁) ALL(可以在哪些主机)=(ALL)(以哪些用户的身份) ALL(运行哪些命令)

%wheel(哪些组)         ALL(可以在哪些主机)=(ALL)(以哪些用户的身份)      ALL(运行哪些命令)

也就是说,root可以在任何主机以任何用户的身份运行任何命令

加入wheel组的用户,可以在任何主机以任何用户的身份运行任何命令

我们可以在此基础上通过visudo进行增加或删改。

新增的条目仍然需要遵循以下格式:

users         hosts=(runas)              commands

users(用户):

  可以直接使用username

  也可以使用uid(数字)

  %groupname(某个组)

  %gid(%加组id)

  user_alias(用户别名),支持将多个用户定义为一组用户,称之为用户别名,即user_alias;

hosts字段表明可以在何处主机执行sudo,这一字段可以填写:

  ip地址

  或者hostname(主机名)

  或者host_alias(别名,类比user的别名,你就能体会他的含义)

                                                       

runas字段表示以何种身份运行,这一字段的填写参考user字段:

commands这一字段表示能运行哪些指令,请务必填写绝对路径。(因为不同的用户PATH变量都有所不同)。多个命令也可以一起写成别名

定义别名的方法:

  ALIAS_TYPE  NAME=item1, item2, item3, ...

  NAME:别名名称,必须使用全大写字符;

  ALIAS_TYPE:

   User_Alias

   Host_Alias

   Runas_Alias

   Cmnd_Alias                                            

例如:

  User_Alias  NETADMIN=tom, jerry

  Cmnd_Alias NETCMND=useradd,usermod

使用visudo编辑好sudoer文件之后,切换到对应用户即可使用sudo命令

认证机制:成功认证后的一段时间无需认证,默认为5分钟;

以sudo的方式来运行指定的命令;

sudo  [options]  COMMAND                      

  -l 列出用户能执行的命令

  -k 清除此前缓存用户成功认证结果;

另外,在通过sudo放权的时候,要注意一些逻辑上的安全漏洞。比如你允许某用户能通过sudo以root用户来修改其他用户的密码。一旦它拥有此权限,虽然他不知道root的密码,但是他可以直接通过sudo把root密码改掉并且登录上去,是很严重的安全隐患。

举例:

赋予test用户增加用户、修改用户属性、修改除了root以外用户的密码的权限。(用!来排除) 

visudo之后在文末添加两行:   

    

Cmnd_Alias USERADMINCMNDS = /usr/sbin/useradd, /usr/sbin/usermod,/usr/bin/passwd, !/usr/bin/passwd root, !/usr/bin/passwd root --stdin

test ALL=(root) USERADMINCMNDS

切换到test之后,可以使用sudo –l查看可执行命令

[test@localhost ~]$ sudo -l

[sudo] password for test:

Matching Defaults entries for test on localhost:

    !visiblepw,always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAYHOSTNAME

    HISTSIZE KDEDIRLS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESSLC_CTYPE",

   env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENTLC_MESSAGES", env_keep+="LC_MONETARY

    LC_NAME LC_NUMERICLC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS

    _XKB_CHARSETXAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User test may run the following commands on localhost:

    (root)/usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd, !/usr/bin/passwd root,

        !/usr/bin/passwdroot --stdin

[test@localhost ~]$

可以看到test可以以root的身份执行/usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd且不能修改root密码。

[test@localhost ~]$ sudo passwd root

[sudo] password for test:

Sorry, user test is not allowed to execute '/bin/passwd root' asroot on localhost.localdomain.

[test@localhost ~]$ echo "hello" | sudo passwd root--stdin

Sorry, user test is not allowed to execute '/bin/passwd root--stdin' as root on localhost.localdomain.

但是可以新建用户并修改非root用户的密码。另外,当你成功通过一次sudo的密码认证后,5分钟之内都不用再输入密码了。

[test@localhost ~]$ sudo useradd mytest

[test@localhost ~]$ echo "mytest" | sudo passwd mytest--stdin

Changing password for user mytest.

passwd: all authentication tokens updated successfully.

[test@localhost ~]$

权限部分到此结束,下一节开启新内容。

猜你喜欢

转载自blog.csdn.net/syaziou/article/details/82148474