【前 言】
在日常的系统管理中,如何分配权限是其中重要一环,本着权限越小安全性越好的原则,我们通常不能随意的使用root用户来登录管理系统,而应该使用普通用户。那么问题来了,普通用户对某些文件或某些命令是没有权限执行操作的,只有管理员才有权限,我们可以使用su命令切换到管理员账户去执行操作,但是这使得每个人都需要知道管理员的密码且切换成管理员用户后用户就可以在系统上任意驰骋,这就没有什么安全性可言了。sudo就是我们的救星,其能很好的满足我们的管理需求,下面就让我们一块来学习下sudo的相关知识。
【何为sudo】
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。
【sudo的功能特性】
1、限制指定用户在指定主机上运行指定的管理命令;
2、详细记录每个用户基于sudo执行的命令的相关日志信息;
3、sudo使用时间戳文件来执行类似的“检票”系统。“检票系统”:用户第一次执行sudo会要求输入自身密码,验证通过用户会获得一个有固定存活时长的“入场券”;默认为5分钟;
4、 sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440。
【sudo工作原理】
sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
【配置sudo】
以管理员用户身份使用专用配置编辑命令(visudo)来编辑配置文件(/etc/sudoers)完成配置。
注意:编辑sudo的配置文件/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。
配置文件的组成部分:
一、别名定义(不是必须的);
通用格式:Alias_Type NAME = item1, item2, ...
注意: ◆NAME 就是别名啦,NMAE的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如SYSADMIN、SYS_CONTROL是合法的,sYSADMIN或1SYNAD是不合法的;
◆item可以理解为项目也可理解为成员,如果一个别名下有多个成员,成员与成员之间,通过半角的逗号","分隔;且成员必须是有效并事实存在的;
◆一次定义多个别名,相互之间用:分隔。
1、定义用户别名:
User_Alias NAME = item1, item2, item3 : NAME = item4, item
item可以为:用户,%用户组,#用户ID(#UID),用户组ID(%#GID),用户别名;
实例:User_Alias ADMINS = jsmith, mikem : WEBADMIN = jerry,tom
2、定义主机别名:
Host_Alias NAME = item1, item2, item3 : NAME = item4, item5
item可以为: 主机名, ip地址(单个或整段),网络地址, 掩码,host_alias;
实例:Host_Alias WEB1 = web01, test1 : WEB2 = web2,192.168.1.0/24
3、定义命令别名:
Cmnd_Alias NAME = item1, item2, item3 : NAME = item4, item5
item可以为:命令名, 目录(目录下的所有命令),"sudoedit"(编辑sudo本身),Cmnd_Alias;
注意:命令一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患 ,因此使用的时候也是使用绝对路径;当需要排除指定命令时,只需要在定义的最后使用!标记要排除的命令;
实例:Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
Cmnd_Alias PWD = usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root
4、定义目标用户别名: 即指定sudo 允许切换至的用户
Runas_Alias NAME = item1, item2, item3 : NAME = item4, item5
item可以为: 用户,%用户组,#用户ID(#UID),用户组ID(%#GID),用户别名;
实例:Runas_Alias ADMIN = root, jerry
二、授权规则(必须的);
定义格式:
[%]WHO HOST=(WHOM)[NOPASSWD:] COMMAND1, COMMAND2...
谁以谁的身份在那些主机上运行那些命令
WHO: 用户名,用户列表别名,用户组别名(前面必须加%);
定义格式说明:
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1, [命令2],[命令3]......
注解:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan)。
注意:此处是否需要密码验证(NOPASSWD:),验证的是WHO的的密码,而不是目标用户的密码;且NOPASSWD:的定义位置很重要,在NOPASSWD:前面的命令需要密码验证,在其后面的命令都无需密码验证。
实例:root ALL=(ALL) ALL #root用户对所有主机拥有所有用户所有命令的执行权限;
USE WEB1=(ADMIN) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel,! /usr/sbin/userdel admin
#别名用户USE在别名主机WEB1上可以切换到目标用户ADMIN,无需输入用户的密码,便能执行用户添加命令、删除命令,但不能执行删除admin这个用户。
三、运用举例;
[[email protected] root]$ passwd tom #修改用户tom的密码; passwd: Only root can specify a user name. #提示只有管理员才有权限; [[email protected] etc]# visudo -f /etc/sudoers #编辑sudo的配置文件,添加授权定义; User_Alias TEST = tom,jerry #定义用户别名TEST包含用户tom,jerry; Runas_Alias OP = root #定义目标用户是root,也就是使用root用户来执行命令; Cmnd_Alias USEADM = /usr/sbin/useradd,/usr/sbin/userdel #定义命令别名,USEADM可创建、 删除用户; Cmnd_Alias PWDADM = /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root #定义命令别名, PWDADM可以修改用户密码,root用户除外; TEST ALL=(OP) USEADM, NOPASSWD: PWDADM #定义授权规则,tom与jerry可以在主机上以root用户的身 份执行用户的添加、删除(需要验证用户密码),可以修改任意用户密码,root用户除外(无需验证用户密码); [[email protected] root]$ sudo -l #以tom账户登录系统时,显示tom在该主机上使用sudo可用的命令; User tom may run the following commands on this host: (root) /usr/sbin/useradd, /usr/sbin/userdel, (root) NOPASSWD: /usr/bin/passwd [a-zA-Z0-9]*, !/usr/bin/passwd root [[email protected] root]$ sudo passwd test #修改test用户的密码; Changing password for user test. #此处直接提示修改test的密码,而没有验证tom的密码; New password: Retype new password: passwd: all authentication tokens updated successfully. #修改成功! [[email protected] root]$ sudo useradd test1 #添加用户test1; [sudo] password for tom: #提示需要验证tom的密码,输入tom的密码才能继续; [[email protected] ~]# tail -1 /etc/passwd #查看用户文件,验证test1是否添加成功; test1:x:503:503::/home/test1:/bin/bash #OK,test1已经成功添加!
【sudo命令的使用】
sudo [选项] 命令
选项:
-l: 查看当前用户可执行的sudo命令
-u 用户名 命令:以指定用户的身份运行后面的“命令”;此
-k: 清除“入场券”;
-b 命令:在后台运行指定的命令
-p 提示语:可以更改询问密码的提示语,其可用%u变量来替换为用户名,%h替换为主机名;
-e 文件路径:不是执行命令,而修改指定的文件;
[[email protected] root]$ sudo -l #显示jerry可执行的sudo命令; 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, /usr/sbin/userdel, (root) NOPASSWD: /usr/bin/passwd [a-zA-Z0-9]*, !/usr/bin/passwd root [[email protected] root]$ sudo -u root passwd test1 #使用root用户来修改test1的密码;此处用户与命令 的授权需事先定义好,否则会执行不成功,报错! Changing password for user test1. New password: Retype new password: passwd: all authentication tokens updated successfully. [[email protected] root]$ sudo -p "%u Please you pwd on %h " userdel test1 #修改询问密码的提示语; jerry Please you pwd on dns [[email protected] root]$ # 好了,sudo命令的更多更具体使用可以去找下man,此处我就简单说明下。
OK!sudo的使用、定义、配置,我就简单总结至此,要是有啥总结不周之处,还请各位大神拍砖!谢谢!