欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 17_03 _sudo详解 有大用

linux ks =http://172.16.0.1/exam.cfg

(ks与等于后没有空格) (本文中等于号=与前面的内容一般情况下不应该有空格)

50台服务器

    网络:定义网络属性,tom

    用户:用户管理,jerry


linux: root

Tom: root


用户:管理员和普通用户

su (switch user)


sudo (切换用户来执行某种命令的操作)

sudo COMMAND        

一个普通用户能够以另外一个用户的身份执行某条命令,但是并不需要切换到那个用户的身份去执行,只不过是执行命令的那一刻它拥有了对应用户的权限  (这些命令也仅仅是我定义给他的命令,其它的命令都不能执行)

有点类似于suid 在执行命令的时候,用户用的不是自身的身份,而是执行文件的属主的身份


sudo 能够定义某个用户能够以另外某一个用户(未必是管理员)的身份通过某主机执行某命令的一种机制


useradd,


jerry,


useradd admin

要求输密码: jerry密码



image.png


可以以任何人的身份来执行,但是一般来讲,是以管理员的身份来执行管理类的命令的

谁可以以另一个人的身份来执行什么样的命令,保存在一个叫 /etc/sudoers 配置文件当中

为了避免其它用户能够查看  /etc/sudoers ,权限很关键 440 (只读的)

(只有root用户和root组中的用户才能查看它的内容)


visudo

如果不是语法自身的某些关键字定义的某些功能的话,它的每一行通常表示定义了一个sudo条目

一个sudo条目定义了哪个用户能够以另外哪个用户的身份在哪些主机上执行什么命令,

所以它的语法格式非常简单             root    ALL =(ALL)       ALL

who     which_hosts =(runas)    command

谁        哪些主机上 =(谁的身份,以哪个用户的身份)    什么命令


可以混合着使用,比如 who使用别名,其它三个不使用别名

哪些主机上并不是哪些主机上自身运行,而是哪些主机上能够远程连接到当前主机上运行

who:User_Alias

whick_hosts:Host_Alias

runas:Runas_Alias

command:Cmnd_Alias



Defaults 关键字能够定义默认属性

假设 3 个用户能够以root身份执行 useradd,usermod,userdel,passwd 这些命令

假设 3, root,useradd,usermod,userdel,passwd


别名:类似定义了组,只不过sudo中称之为别名

别名的定义,遵循 EBNF语法结构(EBNF是一种描述性语言,可以定义一个宏,它的取值是什么样子的取值)

别名的名字必须要全部使用大写,只能使用大写英文字母的组合

定义别名的时候可以使用感叹号 ! 取反的

别名只能先定义,后面才能使用


用户别名

User_Alias USERADMIN =         (等于号的后边可以是用户名,也可以是组(前面要加百分号%))

                用户的用户名

                组名,使用%引导

                还可以包含其它已经定义的用户别名(别名是可以嵌套的)


Host_Alias

                主机名

                IP

                网络地址

                其它主机别名(别名是可以嵌套的)

Runas_Alias:

               用户的用户名

               组名,使用%引导

               还可以包含其它的Runas别名(别名是可以嵌套的)

                

Cmnd_Alias:

               命令路径(防止出错,用绝对路径,)

               目录(表示这个目录下面的所有命令都包含进来)

               其它事先定义过的命令别名 



hadoop 用户能够以root身份执行 useradd 和 usermod命令

hadoop,root, useradd usermod



每一次以管理员的身份执行命令都让我们输密码,很麻烦,所以sudo默认情况下,在用户第一次通过认证之后会将密码认证信息记录下来,并让他的有效期为5分钟    (第一次输密码之后,5分钟之内,不用再次输密码了)



sudo 命令

    -l:列出当前用户所有可以使用的所有sudo类命令

    -k: 让认证信息失效    (sudo命令的时候直接加上-k也是可以的,表示此时就算我们已经认证了,也不会让系统将密码记录下来的)

    



管理员也可以定义 用户执行 sudo 时,压根从来都不需要输密码的 加上标签,与命令冒号空格隔开就可以了

标签最著名一个就是 NOPASSWD  (最常用的就是 NOPASSWD  和 PASSWD,其它的标签很少用到,马哥就不说了 )

who which_hosts =(runas) TAG: command


[root@localhost ~]# ll /etc/sudoers

-r--r----- 1 root root 3381 2013-06-07 /etc/sudoers

[root@localhost ~]# vim /etc/sudoers

image.png

image.png

vim 编辑这个文件的时候是与编辑 crontab文件是一样的,它无法检查这个文件的语法的正确性

(万一写了一个错误的命令,其它用户执行这个命令的时候,可能因为语法错误,无法进行,严重者,有可能导致系统崩溃的)

因 sudo 有个专门的命令叫 visudo,专门用来编辑 /etc/sudoers 文件的一个命令,这个命令本身可以检查 /etc/sudoers 文件的语法的正确性


[root@localhost ~]# man visudo

(可以使用 -f 指定另外一个文件)

image.png

image.png



[root@localhost ~]# visudo

## Sudoers allows particular users to run various commands as

## the root user, without needing the root password.

##

## Examples are provided at the bottom of the file for collections

## of related commands, which can then be delegated out to particular

## users or groups.

##

## This file must be edited with the 'visudo' command.


## Host Aliases

## Groups of machines. You may prefer to use hostnames (perhap using

## wildcards for entire domains) or IP addresses instead.

# Host_Alias     FILESERVERS = fs1, fs2

# Host_Alias     MAILSERVERS = smtp, smtp2


## User Aliases

## These aren't often necessary, as you can use regular groups

## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname

## rather than USERALIAS

# User_Alias ADMINS = jsmith, mikem



## Command Aliases

## These are groups of related commands...


## Networking

#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


## Installation and management of software

#Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum


## Services

#Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig


## Updating the locate database

#Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage

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


## Delegating permissions

#Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp


## Processes

#Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall


## Drivers

#Cmnd_Alias DRIVERS = /sbin/modprobe


# Defaults specification

#

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.

#         You have to run "ssh -t hostname sudo <cmd>".

#

Defaults    requiretty


#

# Refuse to run if unable to disable echo on the tty. This setting should also be

# changed in order to be able to use sudo without a tty. See requiretty above.

#

Defaults   !visiblepw


Defaults    env_reset

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \

                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \

                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \

                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \

                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \

                        _XKB_CHARSET XAUTHORITY"


## Next comes the main part: which users can run what software on

## which machines (the sudoers file can be shared between multiple

## systems).

## Syntax:

##

##      user    MACHINE =COMMANDS

##

## The COMMANDS section may have other options added to it.

##

## Allow root to run any commands anywhere

root    ALL =(ALL)       ALL

## 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






[root@localhost ~]# man sudoers   (这个对查sudo非常有用  有大用)

image.png

image.png

image.png

image.png

image.pngimage.png

image.png



hadoop 用户能够以root身份执行 useradd 和 usermod命令

hadoop,root, useradd usermod



[root@localhost ~]# useradd hadoop

useradd:用户 hadoop 已存在

[root@localhost ~]# su - haddop

su: 用户 haddop 不存在

[root@localhost ~]# su - hadoop

[hadoop@localhost ~]$

[hadoop@localhost ~]$ useradd        (找不到这个命令)

-bash: useradd: command not found

[hadoop@localhost ~]$


[hadoop@localhost ~]$ /usr/sbin/useradd tom

-bash: /usr/sbin/useradd: 权限不够


[hadoop@localhost ~]$ sudo /usr/sbin/useradd tom


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 hadoop:        (这里输hadoop 自己的密码)

hadoop is not in the sudoers file.  This incident will be reported.

没有在 sudoers 文件中定义,所以执行不了

[hadoop@localhost ~]$



在 root 用户下定义

[root@localhost ~]# visudo

在最后加上这一行 (ALL 表示宏,所有)(可以表示所有人,所有主机,所有命令) (root可以不写,省略表示管理员)

hadoop 用户能够以root身份执行 useradd 和 usermod命令


hadoop ALL =(root) useradd, usermod


:wq         保存退出


image.png

最后一行(命令使用绝对路径 )改为 下面这样

hadoop ALL =(root) /usr/sbin/useradd, /usr/sbin/usermod

:wq         保存退出



在 hadoop 用户下 

[hadoop@localhost ~]$ sudo /usr/sbin/useradd tom

[sudo] password for hadoop:

[hadoop@localhost ~]$

[hadoop@localhost ~]$ tail -1 /etc/passwd            (可以看到tom这个用户添加成功了)

tom:x:502:502::/home/tom:/bin/bash

[hadoop@localhost ~]$

[hadoop@localhost ~]$ sudo /usr/sbin/userdel tom        (不允许执行 /usr/sbin/userdel 命令)

Sorry, user hadoop is not allowed to execute '/usr/sbin/userdel tom' as root on localhost.localdomain.

[hadoop@localhost ~]$


[hadoop@localhost ~]$ sudo /usr/sbin/usermod -s /bin/csh tom        (修改用户shell)

[sudo] password for hadoop:

image.png    (马哥第二次执行不用输密码)

[hadoop@localhost ~]$

[hadoop@localhost ~]$ tail -1 /etc/passwd        (可以看到 shell 改变了)

tom:x:502:502::/home/tom:/bin/csh

[hadoop@localhost ~]$


[root@localhost ~]# man sudo

image.png


一旦执行了  -k (-k kill)选项, 下一次再执行 sudo命令的时候,无论有没有超出5分钟,都必须要指供密码的

-k 可以让以前输入的认证信息失效,并要求重新进行认证的

-K (大K) 的意思是?不要求输密码

[hadoop@localhost ~]$ sudo -k

[hadoop@localhost ~]$

[hadoop@localhost ~]$ sudo /usr/sbin/usermod -s /bin/csh tom        (又要输密码了)

[sudo] password for hadoop:

[hadoop@localhost ~]$

[hadoop@localhost ~]$ sudo -k            (再一次执行它)

[hadoop@localhost ~]$ sudo /usr/sbin/usermod -s /bin/csh tom       (再又要输密码了)

[sudo] password for hadoop:

[hadoop@localhost ~]$


-l (-l list) 作为普通用户来讲,可以使用 sudo -l 可以列出来当前用户可以以哪个用户的身份执行什么命令

[hadoop@localhost ~]$ sudo -l  

Matching Defaults entries for hadoop on this host:

    requiretty, !visiblepw, env_reset, env_keep ="COLORS DISPLAY HOSTNAME

    HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR USERNAME LANG

    LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES

    LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL

    LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"


Runas and Command-specific defaults for hadoop:



User hadoop may run the following commands on this host:

    (root) /usr/sbin/useradd, (root) /usr/sbin/usermod

[hadoop@localhost ~]$


管理员root下

[root@localhost ~]# man sudoers

CDROM =  NOPASSWD:  /sbin/umount /CDROM,......

表示 一旦加了 NOPASSWD 标签以后,所以位于这个标签后的所有命令,普通用户使用的时候就不再需要输密码了

image.png

管理员root下

[root@localhost ~]# visudo

最好一行改为 如下 (也就是在命令前面加上NOPASSWD: ),这样子的话,无论用户怎么输入,他再也不需要输密码了,

也没有5分钟有效期限的概念了


hadoop ALL =(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/usermod

image.png



普通用户 hadoop 下


[hadoop@localhost ~]$ sudo -k        (清除一下此前的认证信息)


[hadoop@localhost ~]$ sudo /usr/sbin/useradd jerry        ( 此时就不提示我们要输密码了)

[hadoop@localhost ~]$


管理员root下

[root@localhost ~]# visudo

最后一行改为 下面的这一行 (此时 useradd 不必输密码,而usermod需要输密码)

(如果有几个密码不需要输密码的话,那么把PASSWD朝后放放吧,这样NOPASSWD后面的且  PASSWD前面的所有命令就不需要输密码了)

hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod


[root@localhost ~]# visudo         

增加下面两行    (hadoop 是一个用组,%hadoop是group,即组,%useradmin也是一个group,即组)

User_Alias USERADMIN = hadoop, %hadoop, %useradmin

Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userd

el, /usr/bin/passwd

hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod #这是原来的增加的代码



visudo: Warning: unused User_Alias USERADMIN

visudo: Warning: unused Cmnd_Alias USERADMINCMND

[root@localhost ~]# which passwd

/usr/bin/passwd

[root@localhost ~]# visudo     

修改共三行代码如下  ( !  /usr/bin/passwd  root 不允许对 root 改密码)

命令匹配的时候 是按照最佳匹配方式(最细分的匹配方式),最优先


User_Alias USERADMIN = hadoop, %hadoop, $useradmin

Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /usr/bin/passwd, !  /usr/bin/passwd  root



USERADMIN  ALL=(root) NOPASSWD: USERADMINCMND



到 hadoop 用户下


[hadoop@localhost ~]$ sudo /usr/bin/passwd tom

Changing password for user tom.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[hadoop@localhost ~]$



[hadoop@localhost ~]$ sudo /usr/bin/passwd root        (此时可以看到没有权限对root改密码)

[sudo] password for hadoop:

Sorry, user hadoop is not allowed to execute '/usr/bin/passwd root' as root on localhost.localdomain.

[hadoop@localhost ~]$


[hadoop@localhost ~]$ sudo /usr/bin/passwd            (但是这样(不加任何用户)仍然可以改管理员密码)

Changing password for user root.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[hadoop@localhost ~]$



[root@localhost ~]# man sudoers

image.png



管理员root下 

[root@localhost ~]# visudo                ([A-Za-z]* 因为用户名只能是字符字母,*表示匹配前面的字符是零或多次的话,就是正则表达式,换句话说,前面的字符不出面也可以)

(见下面,因为是无权限执行的,所以这里不是正则,是类似于glob globbing 的文件名通配符)

最后三行改为 

User_Alias USERADMIN = hadoop, %hadoop, $useradmin

Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z]*, ! /usr/bin/passwd root



USERADMIN  ALL=(root) NOPASSWD: USERADMINCMND



用户 hadoop 下

[hadoop@localhost ~]$ sudo /usr/bin/passwd        (不可以)

[sudo] password for hadoop:

Sorry, user hadoop is not allowed to execute '/usr/bin/passwd' as root on localhost.localdomain.

[hadoop@localhost ~]$


其它任何人执行的 sudo 都会记录日志里的,(谁以管理员的身份执行的命令)

在  /var/log/secure 这个文件里面

一般情况下,不要让其它用户可以操作  /var/log/secure 这个文件

[root@localhost ~]# tail /var/log/secure

Jan  2 22:13:37 localhost sshd[5091]: pam_unix(sshd:session): session closed for user root

Jan  2 22:13:38 localhost su: pam_unix(su-l:session): session closed for user hadoop

Jan  4 09:04:30 localhost sshd[3862]: Server listening on :: port 22.

Jan  4 09:04:30 localhost sshd[3862]: Server listening on 0.0.0.0 port 22.

Jan  4 09:04:48 localhost sshd[4119]: Accepted password for root from 192.168.1.101 port 4304 ssh2

Jan  4 09:04:48 localhost sshd[4119]: pam_unix(sshd:session): session opened for user root by (uid=0)

Jan  4 09:14:00 localhost sshd[4172]: Accepted password for root from 192.168.1.101 port 4482 ssh2

Jan  4 09:14:00 localhost sshd[4172]: pam_unix(sshd:session): session opened for user root by (uid=0)

Jan  4 09:14:23 localhost su: pam_unix(su-l:session): session opened for user hadoop by root(uid=0)

Jan  4 09:15:19 localhost sudo:   hadoop : command not allowed ; TTY=pts/1 ; PWD=/home/hadoop ; USER=root ; COMMAND=/usr/bin/passwd

[root@localhost ~]#

[root@localhost ~]# ll /var/log/secure        ( /var/log/secure 权限 600 )

-rw------- 1 root root 6582 01-04 09:15 /var/log/secure

[root@localhost ~]#


1,能修改 eth0  的网络属性

2,怎么定义另外的用户具有跟root用户一样的权限



普通分类: