本文共 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/