欢迎各位兄弟 发布技术文章
这里的技术是共享的
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密码
可以以任何人的身份来执行,但是一般来讲,是以管理员的身份来执行管理类的命令的
谁可以以另一个人的身份来执行什么样的命令,保存在一个叫 /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
vim 编辑这个文件的时候是与编辑 crontab文件是一样的,它无法检查这个文件的语法的正确性
(万一写了一个错误的命令,其它用户执行这个命令的时候,可能因为语法错误,无法进行,严重者,有可能导致系统崩溃的)
因 sudo 有个专门的命令叫 visudo,专门用来编辑 /etc/sudoers 文件的一个命令,这个命令本身可以检查 /etc/sudoers 文件的语法的正确性
[root@localhost ~]# man visudo
(可以使用 -f 指定另外一个文件)
[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非常有用 有大用)
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 保存退出
最后一行(命令使用绝对路径 )改为 下面这样
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:
(马哥第二次执行不用输密码)
[hadoop@localhost ~]$
[hadoop@localhost ~]$ tail -1 /etc/passwd (可以看到 shell 改变了)
tom:x:502:502::/home/tom:/bin/csh
[hadoop@localhost ~]$
[root@localhost ~]# man sudo
一旦执行了 -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 标签以后,所以位于这个标签后的所有命令,普通用户使用的时候就不再需要输密码了
管理员root下
[root@localhost ~]# visudo
最好一行改为 如下 (也就是在命令前面加上NOPASSWD: ),这样子的话,无论用户怎么输入,他再也不需要输密码了,
也没有5分钟有效期限的概念了
hadoop ALL =(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/usermod
普通用户 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
管理员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用户一样的权限