首页 > 代码库 > Linux课程笔记 Day04 课上内容总结
Linux课程笔记 Day04 课上内容总结
1. Crond介绍
1.0 定时任务比较及cron语法
Linux的任务调度可以分为两类:
|
Linux系统下另外两种定时任务软件:
at:适合仅执行一次的调度任务,需要启动一个名为atd的服务
anacron:这个命令主要用于非7*24小时开机的服务器,anacron并不能指定具体时间执行任务,而是以天为周期或者在系统每次开机后需要执行的任务,它会检测停机期间应该进行,但是并没有进行的crontab任务工作,执行一遍。
这两种比较少用
|
指令语法:
Crontab [-u user] file Crontab [-u user] {-l |-r |-e}
|
指令说明:
通过crontab我们可以在固定的间隔时间执行指定的系统指令或shell脚本,时间间隔可以是分钟、小时、日、月、周及以上的任意组合(日和周不要组合)。
|
1.1使用者权限文件
文件 | 说明 |
/etc/cron.deny | 该文件所列用户不允许使用crontab命令 |
/etc/cron.allow | 该文件所列用户允许使用crontab命令 |
/var/spool/cron | 所有用户crontab文件存放的目录,以用户名命名 |
1.2指令选项说明含义表
参数名称 | 含义 | 指定示例 |
-l(字母) | 显示用户crontab文件内容, | crontab -l |
-e | 进入vi编辑用户crontab文件 | crontab -e |
-i | 删除用户crontab文件前确认提示 | crontab -i |
-r | 从crontab目录中删除用户crontab文件 | crontab -r |
-u user | 指定使用者 | crontab –u qinbf –l |
1.3 指令的使用格式
默认情况下,用户所见建立的crontab文件存放于/var/spool/cron文件中,其crontab对应的文件名与用户名一致。
格式共分为七段,前五段为时间设定段,第六段以哪个用户执行crontab(默认是当前用户),第七段为所要执行的命令段。
1.4 Crontab时间段的含义如表:
段 | 含义 | 取值范围 |
第一段 | 分钟 | 00-59 |
第二段 | 小时 | 00-23 |
第三段 | 日期 | 01-31 |
第四段 | 月份 | 01-12 |
第五段 | 星期几 | 0-6 |
1.5特殊符号含义如下:
特殊符号 | 含义 |
* | 表示任意时间都 |
- | 减号,表示分隔符,表示一个时间范围段 |
, | 逗号,表示分隔时间段的意思 |
/n | n代表数字,“即每隔n单位时间” |
1.6 crontab依赖的服务:
chkconfig --list |grep crond
/etc/init.d/crond status |
1.7crontab实例说明
1) 30 3,12 * * * /bin/sh /scripts/oldboy.sh 2) 30 */6 * * * /bin/sh /scripts/oldboy.sh #--à第二列*/6表示每6个小时,也相当于6,12,18,24 3)30 8-18/2 * * * /bin/sh /scripts/oldboy.sh #-à第二列8-18/2代表早晨8点到下午18点之间每2小时,也相当于8,10,12,14,16,18 4)* 23-7/1 * * * /application/apachectl restart #----à实际上的效果是,晚上到早上的7点,每小时的每一分钟都重启apache,如果是想达到每小时才重启的话,前面的分钟段,可以设置为0或者30之类的 5)服务器时间同步:系统每5分钟同步一次时间 [root@test2 ~]# crontab -l */5 * * * * /sbin/ntpdate time.windows.com >/dev/dull 2&>1 |
1.8 crontab命令生产环境专业写法
例1:每一分钟打印一次自己的名字到/server/log/自己的名字命令的文件中。 答案: #print char task by oldboy for programmer A at 2010-12-12 */1 * * * * echo “oldboy” >>/server/log/oldboy.log 2>&1
例2:每周六、日上午9:00和下午14:00来老男孩linux运维实战培训中心学习(/server/script/oldboy.sh) 答案: #cron job for ett by oldboy 2010-12-12 00 09,14 * * 6,0 /bin/sh /server/script/oldboy.sh >/dev/null 2>&1 针对以上两生产例子说明: 1写定时任务要写清注释是个好习惯,比如什么人,什么时间,因为谁,做了什么事 2执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh,否则有可能因为脚本没有执行权限而无法执行 3需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下,然后设置,这里要注意不同用户的环境变量问题。 4定时任务命令的结尾最好加上>/dev/null 2>&1等内容,如果需要打印日志,可以追加到指定日志,不推荐留这种不专业的做法 如果定时任务不加>/dev/null 2>&1等命令设置,时间长了,可能会导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘空间inode节点。 5在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内容命令去掉,如果还需要,可定向到日志里。 |
1.9 crontab生产解决案例
案例1:No space left on device故障1
在设置crontab时,提示No space left on device。用df –k检查还有空间,用df –i显示/var已占用100%,如果inode耗尽,则系统上下将不能创建文件。
在/var/spool/clientmqueue/下有超多的文件ls半天没反应,用rm -fr *会自动跳出root,然后用xargs来配合解决。cd /var/spool/clientmqueue&& ls |xargs rm –f
最后清理了该目录的内容。当然,如果文件数超多,执行ls |xargs rm –f也会长时间无反应,此时也可以直接cd /var/spool/&&rm –rf clientmqueue,然后mkdir clientmqueque && chmod 770 clientmqueue &&chown smmsp,smmsp -R /var/spool/clientmqueue。
原因分析:系统中,cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就会产生这些文件。
解决办法:开启邮件服务,并将crontab里面的命令后面加上>/dev/null 2>&1,在做定时脚本时,把屏幕输出定向到日志中。
案例2:No space left on device故障2
- when you create a new directory of file,system will say :No space left on device
[ett@linux /var]#mkdir ett Mkdir:cannot create directory ett’:No space left on device |
- when create crontab for account ett,you will receive error information as follows;
Crotab:installing new crontab Cron/tmp.6655:No space left on device Crontab:edits left in /tmp/crontab.6655 |
解决过程 1检查分区使用率,df -h 2检查/var/lock下的文件,删除/var/lock/subsys/nfx,touch /var/ett,成功创建文件,删除/var/ett 3发现删除/var/lock下的任意一个文件后,都可以成功创建一个文件,再创建就会失败。 4将检查扩大到/var/下的其他目录 5怀疑分区/var/de inode用尽导致上述问题,检查inode使用率 6分区/var/没有配置quota 7发现/var/spool/clientmqueue下面有太多的文件,由于系统的邮件服务配置有问题,导致系统发出的邮件堆积在队列目录中,占用大量的inode节点。
处理方法:确认/var/spool/clientmqueue下的文件已经无用,删除之,如果文件数量太大,无法使用rm -f * 直接删除,可以选择ls |xargs rm -f 或者直接删除上级目录,然后重建该目录,并赋予正确的属主和权限。
最好的解决办法是重新设置系统邮件,使其能正常发送或找到发邮件的源头,如本文的crontab任务。
结论:分区/var/的 inode全部用尽,free inode为0,导致无法创建新的文件或目录,以后遇到类似的问题要注意用df -li检查inode的使用情况。 |
|
1.10生产场景如何调试crontab定时任务
|
1.11 定时任务生产问题8条箴言
|
1.12 定时清理垃圾文件
crontab -l |tail -2 #del clientmqueue files by oldboy at 2010-09-26 00 00 * * 0 /bin/bash /server/scripts/del_sys_file.sh > /dev/null 2>&1
cat /server/scripts/del_sys_file.sh find /var/spool/clientmqueue/ -type f | xargs rm -f |
1.13 crond章节重点
1) 用户使用crontab -e自定义定时任务项目,分为六段,[分、时、日、月、周、指令]。
2) 系统的/etc/crontab定时任务项目分为7段,[分、时、日、月、周、用户、指令]。
3) crontab定时任务的5个生产基本要领和7点调试技巧,尤其是学会看服务日志来调试
4) 生产环境使用crontab定时任务要注意的8点箴言
5) 重视生产的案例及通过案例为载体来学习巩固技术知识
2. Linux系统的用户和用户组管理
2.1 用户管理的文件
2.1 .1 /etc/skel目录
/etc/skel目录是用来存放新用户配置文件的目录,当我们添加用户时,这个目录下的所有文件会自动改被复制到新添加的用户的家目录下。
示例:在/etc/skel目录下创建一个文件,看看新创建的用户家目录下是否有这个文件
[root@test2 skel]# ll -a /etc/skel/ 总计 56 drwxr-xr-x 2 root root 4096 06-02 20:02 . drwxr-xr-x 92 root root 12288 06-03 06:11 .. -rw-r--r-- 1 root root 33 2011-07-22 .bash_logout -rw-r--r-- 1 root root 176 2011-07-22 .bash_profile -rw-r--r-- 1 root root 124 2011-07-22 .bashrc -rw-r--r-- 1 root root 14 06-02 20:02 qinbf.txt [root@test2 skel]# cat qinbf.txt this is qinbf [root@test2 skel]# useradd student [root@test2 skel]# ll -a /home/student/ 总计 48 drwx------ 2 student student 4096 06-03 06:13 . drwxr-xr-x 8 root root 4096 06-03 06:13 .. -rw-r--r-- 1 student student 33 06-03 06:13 .bash_logout -rw-r--r-- 1 student student 176 06-03 06:13 .bash_profile -rw-r--r-- 1 student student 124 06-03 06:13 .bashrc -rw-r--r-- 1 student student 14 06-03 06:13 qinbf.txt [root@test2 skel]# cat /home/student/qinbf.txt this is qinbf |
2.1.2 /etc/login.defs文件
/etc/login.defs文件是用来定义创建用户时需要的一些用户的配置信息,如创建用户时,是否需要家目录,UID和GID的范围等。
示例:修改UID的范围,看看创建的用户UID值得范围
23 # Min/max values for automatic uid selection in useradd 24 # 25 UID_MIN 20000 #--à只修改了UID_MIN,没有修改GID_MIN 26 UID_MAX 60000 [root@test2 etc]# useradd teache [root@test2 etc]# tail -1 /etc/passwd teache:x:20000:20000::/home/teache:/bin/bash |
2.1.3/etc/default/useradd文件
/etc/default/useradd文件是在使用useradd添加用户时,的一个需要调用的一个默认的配置文件,可以使用useradd -D参数。
[root@test2 etc]# cat /etc/default/useradd #useradd default file GROUP=100 HOME=/home #-à把用户的家目录建在/home中 INACTIVE=-1 #--à是否启用账号过期停权,-1表示不启用 EXPIRE= #-à账号终止日期,不设置表示不启用 SHELL=/bin/bash #-à新用户默认所用的shell类型 SKEL=/etc/skel #-à配置新用户家目录的默认文件存放路径,用户家目录下文件都是从这里复制过去的 CREATE_MAIL_SPOOL=yes #--à创建mail文件 |
示例:修改/etc/default/useradd文件的内容,新建一个用户,看看新用户的配置
[root@test2 etc]# mkdir /etc/qinbf/test [root@test2 etc]# ll -a /etc/qinbf/ 总计 40 drwxr-xr-x 3 root root 4096 06-03 06:33 . drwxr-xr-x 93 root root 12288 06-03 06:31 .. -rw-r--r-- 1 root root 14 06-02 20:02 qinbf.txt drwxr-xr-x 2 root root 4096 06-03 06:33 test [root@test2 etc]# sed -i ‘s#/etc/skel#/etc/qinbf#g‘ /etc/default/useradd [root@test2 etc]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/qinbf CREATE_MAIL_SPOOL=yes [root@test2 etc]# useradd student2 [root@test2 etc]# ll -a /home/student2/ 总计 32 drwx------ 3 student2 student2 4096 06-03 06:34 . drwxr-xr-x 10 root root 4096 06-03 06:34 .. -rw-r--r-- 1 student2 student2 14 06-03 06:34 qinbf.txt drwxr-xr-x 2 student2 student2 4096 06-03 06:34 test |
2.2用户管理的命令
2.2.1 useradd
当使用useradd命令不加参数选项,后面直接跟所添加的用户名时,系统会首先读取配置文件/etc/login.defs和/etc/default/useradd中所定义的参数或规则,根据设置的规则添加用户,同时会向/etc/passwd和/etc/group文件内添加新建用户和用户组的记录,并同步/etc/shadows和/etc/gshadows,同时系统还会根据/etc/default/useradd文件中所配置的信息建立用户家目录,并复制/etc/skel中的所有文件(包括隐藏的系统环境配置文件)到新用户的家目录中。
useradd语法(来自man useradd)
名 称 useradd - 帐 号 建 立 或 更 新 新 使 用 者 的 资 讯
语 法 useradd [-c comment] [-d home_dir] [-e expire_date] [-f inactive_time] [-g initial_group] [-G group[,...]] [-m [-k skeleton_dir] | -M] [-s shell] [-u uid [ -o]] [-n] [-r] login
useradd -D [-g default_group] [-b default_home] [-f default_inactive] [-e default_expire_date] [-s default_shell] |
参数说明 | 说 明 |
-c comment | 新 帐 号 password 档 的 说 明 栏 |
-d home_dir | 新 帐 号 每 次 登 入 时 所 使 用 的 home_dir |
-e expire_date | 帐 号 终 止 日 期 。 日 期 的 指 定 格 式 为 MM/DD/YY |
-f inactive_time | 帐 号 过 期 几 日 后 永 久 停 权 。当 值 为 0 时 帐 号 则 立 刻 被 停 权 。而 当 值 为 -1 时 则 关 闭 此 功 能 , 预 设 值 为 -1 |
-g initial_group | group 名 称 或 以 数 字 来 做 为 使 用 者 登 入 起 始 群 组 (group) 。群 组 名 须 为 现 有 存 在 的 名 称 。群 组 数 字 也 须 为 现 有存 在 的 群 组 。预 设 的 群 组 数 字 为 1 。 |
-G group | 定 义 此 使 用 者 为 此 一 堆 groups 的 成 员 。每 个 群 组 使 用 "," 区 格 开 来 , 不 可 以 夹 杂 空 白 字 元 。 群 组 名 同 -g 选 项 的 限 制 。定 义 值 为 使用 者 的 起 始 群 组 。 |
-m | 使 用 者 目 录 如 不 存 在 则 自 动 建 立 。如 使 用 -k 选 项 skeleton_dir 内 的 档 案 将 复 制 至 使 用 者 目录 下 。然 而 在 /etc/skel目 录 下 的 档 案 也 会 复 制 过 去 取 代 。任 何 在 skeleton_dir or /etc/skel 的 目 录 也 相 同 会 在 使 用 者目 录 下 一 一 建 立 。The -k 同 -m 不 建 立 目 录 以 及 不 复 制 任 何 档 案 为 预 设 值 |
-M | 不 建 立 使 用 者 目 录 , 即 使 /etc/login.defs 系 统 档 设 定 要 建立 使 用 者 目 录 。 |
-s shell | 使 用 者 登 入 后 使 用 的 shell 名 称 。预 设 为 不 填 写 , 这 样 系 统 会 帮 你 指 定 预 设 的 登 入 shell |
-u uid [ -o] | 使 用 者 的 ID 值 。 必 须 为 唯 一 的 ID 值 , 除 非 用 -o 选 项 。数 字 不 可 为 负 值。预 设 为 最 小 不 得 小 于 999 而 逐 次 增 加。 0~ 999 传 统 上 是 保 留 给 系 统 帐 号 使 用 。 |
-n | 预 设 值 使 用 者 群 组 与 使 用 者 名 称 会 相 同 。 此 选 项 将 取 消 此 预设 值 |
-r | 此 参 数 是 用 来 建 立 系 统 帐 号。系 统 帐 号 的 UID 会 比 定 义 在 系统 档 上 /etc/login.defs. 的 UID_MIN 来 的 小。注 意 useadd 此 用 法 所 建 立 的 帐 号 不 会建 立 使 用 者 目 录, 也 不 会 在 乎 纪 录 在 /etc/login.defs. 的 定 义 值 。如 果 你 想 要 有 使用 者目录 须 额 外 指 定 -m 参 数 来 建 立 系统 帐 号 。这 是 RED HAT 额 外 增 设 的 选 项 。 |
useradd -D参数选项 | 说明 |
-b default_home | 定义使用者所属目录的前一个目录使用者名称会附加在 default_home后面用来建立新使用的目录。当然使用-d后则此选项无效 。 |
-e default_expire_date | 使用者帐号停止日期 |
-f default_inactive | 帐号过期 日后停权 |
-g default_group | 新帐号起始群组名或ID。群组名须为现有存在的名称。群组I D也须为现有存在的群组 |
-s default_shell | 使用者登入后使用的shell名称。往后新加入的帐号都将使用此 shell |
useradd实例:账号过期时间实例
[root@test2 ~]# date +%F #----à当前时间为6月3号 2013-06-03 [root@test2 ~]# useradd -e 06/04/13 student03 #----à6月4号到期 root@test2 ~]# date -s 06/05/13 #----à将时间设置为6月5号 2013年 06月 05日 星期三 00:00:00 CST
Last login: Mon Jun 3 00:02:45 2013 from 192.168.1.1 [student03@test2 ~]$ #------à可以正常登陆
[root@test2 ~]# date -s 06/06/13 #------à将系统时间设置为6月6号 2013年 06月 06日 星期四 00:00:00 CST
Your account has expired; please contact your system administrator #-----------------à提示账号已经到期 [root@test2 ~]# su - student03 [student03@test2 ~]$ pwd #-------à系统还是可以切换到student03账户下 /home/student03 [tmpuser1@test2 ~]$ chage -l student03 最近一次密码修改时间 : 6月 03, 2013 密码过期时间 :从不 密码失效时间 :从不 帐户过期时间 : 6月 04, 2013 两次改变密码之间相距的最小天数 :0 两次改变密码之间相距的最大天数 :99999 在密码过期之前警告的天数 :7
通过-e设置无法远程连接,但是可以su切换,账户并未被锁定 账户过期时间和系统时间,需要相差2天 |
useradd实例:useradd –c -u -G -s -d 多个参数组合例子
添加用户oldboy6,并设置其用户注释信息为HandsomeBoy,UID指定为806,归属用户为用户组root、oldboy、sa成员,其shell类型为/bin/sh,设置家目录为/oldboy6
root@test2 ~]# useradd -c HandsomeBoy -u 806 -G root,sa -s /bin/sh -d /oldboy6 oldboy6 [root@test2 ~]# grep oldboy6 /etc/passwd
[root@test2 ~]# id oldboy6 uid=806(oldboy6) gid=806(oldboy6) groups=806(oldboy6),0(root),801(sa) context=user_u:system_r:unconfined_t:s0 #------à在添加用户时,如果不使用-n参数,系统会自动创建一个与用户名同名的用户组 |
useradd -D的用法
[root@test2 ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@test2 ~]# useradd -D -e "06/12/13" -b "/home/test" -s /bin/sh [root@test2 ~]# useradd -D GROUP=100 HOME=/home/test INACTIVE=-1 EXPIRE=06/12/13 SHELL=/bin/sh SKEL=/etc/skel CREATE_MAIL_SPOOL=yes #---à实验之后记得恢复之前的默认设置 |
2.2.2 添加用户组命令groupadd
与groupadd命令有关的文件有
/etc/group-用户组相关文件
/etc/gshadow-用户组加密相关文件
groupadd命令语法
语法 groupadd [-g gid [-o]] [-r] [-f] group |
groupadd参数说明
groupadd参数选项 | 注释说明 |
-g gid | 指定用户组GID。除非接-o参数,否则ID值必须是唯一的数字(不能为负数)。如果不指定-g参数,则预备值会从500开始。 |
-r | 建立系统用户组。GID会比/etc/login.defs中定义的UID_MIN值小 |
-f | 新增一个账户,强制覆盖一个已经存在的用户组账号 |
groupadd实例
[root@test2 ~]# groupadd -g 10086 2ma [root@test2 ~]# grep 2ma /etc/group 2ma:x:10086: |
2.3 用户密码相关命令
2.3.1 passwd命令介绍
普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码,超级用户root则可以设置或修改所有用户的密码,
当直接执行passwd命令后面不接任何参数或用户名时,则表示修改当前登录用户的密码。
[root@test2 ~]# passwd Changing password for user root. New UNIX password: [root@test2 ~]# passwd qinbf Changing password for user qinbf. New UNIX password: [root@test2 ~]# passwd root Changing password for user root. New UNIX password: |
passwd命令参数选项
命令参数 | 说明 |
-k, --keep-tokens | 保留即将过期的用户在期满后仍能使用 |
-d,--delete | 删除用户密码,仅能以root权限操作 |
-l,--lock | 锁住用户无权更改其密码,仅能通过root权限操作 |
-u,--unlock | 解除锁定 |
-f,--force | 强制操作,仅root权限操作 |
-x,--maximum=DAYS | 两次密码修改的最大天数,后面接数字;仅能root权限操作 |
-n,--minimin=DAYS | 两次密码修改的最小天数,后面接数字,仅能root权限操作 |
-w,--waring=DAYS | 在距多少天提醒用户修改密码;仅能root权限操作 |
-I,--inactive=DAYS | 在密码过期多少天后,用户被禁掉,仅能以root操作 |
-S,--status | 查询用户的密码状态,仅能root用户操作 |
--stdin | 从stdin读入密码 |
passwd命令实例
实例1:用-l参数来锁定oldboy用户,使之不能修改密码,然后再用-u来解除锁定。
[root@test2 ~]# passwd -l oldboy Locking password for user oldboy. passwd: Success [root@test2 ~]# passwd -S oldboy
|
实例2:我们用-d参数清除test用户密码,然后通过-S参数查看
[root@test2 ~]# passwd -d oldboy Removing password for user oldboy. passwd: Success [root@test2 ~]# passwd -S oldboy
|
疑问:用户密码为空,那么是否通过远程ssh链接就不要密码了呢?
解答:空密码登陆不了。
实例3:举一个组合参数-x -w -i控制密码时效的例子
要求odlboy用户7天内不能更改密码,60天以后必须修改密码。过期前10天通知odlboy用户,过期30天后禁止用户登陆。 [root@test2 ~]# passwd -n 7 -x 60 -w 10 -i 30 test Adjusting aging data for user test. #--àchage -m 7 -M 60 -W 10 -I 30 odlboy命令也可以实现同样功能,只是参数的写法不同 |
实例4:用--stdin参数实现非交互的批量设置或修改密码
#-à记得使用history -c清除历史记录 [root@test2 ~]# vi us.sh
1 #!/bin/bash 2 userchars="oldstudent" #用户字符串,就是用户的前面部分 3 for num in `seq 3` #seq 3 表示1-3 4 5 do 6 useradd $userchars$num #创建用户的命令 7 passwd=`date|md5sum|cut -c3-20` #按照时间md5加密取3-20之间的字符作为用户的密码。此处要注意,密码部分应该要事先定义好变量,否则取值会变化,导致密码生成错误 8 echo "$passwd" |passwd --stdin $userchars$num #这行就是利用--stdin无交互设置密码的参数 9 echo -e "user:$userchars$num\tpasswd:$passwd">>/tmp/user.log #输出创建的用户和密码到user.log文件 10 11 sleep 1 12 done 13 echo -------------------------- 14 cat /tmp/user.log
[root@test2 ~]# sh us.sh Changing password for user oldstudent1. passwd: all authentication tokens updated successfully. Changing password for user oldstudent2. passwd: all authentication tokens updated successfully. Changing password for user oldstudent3. passwd: all authentication tokens updated successfully. -------------------------- user:oldboy1 passwd:7246382a2ba141f2db user:oldboy2 passwd:7aeea9dd5537c975dd user:oldboy3 passwd:4ee64c9a8e85bba809 user:oldstudent1 passwd:9bc57124663721831d user:oldstudent2 passwd:57934e619ad637f218 user:oldstudent3 passwd:5a54c4db74389a02dc |
总结:在实际工作中,最常用的用法就是直接使用passwd加用户名设置和修改密码,其次是加--stdin参数批量无交互设置密码,其他参数用的很少(包括-l,-u,-S等)。
2.3.2 修改用户密码有效期相关命令chage
chage说明
chage和passwd等命令功能有不少是重复的,用来修改用户密码。
chage语法
用法:chage [选项] 用户名
chage参数选项 | 注释说明 |
-d,--lastday 最近日期 | 将最近一次密码设置时间设为“最近日期” |
-E,--expiredate 过期日期 | 将账户过期时间设为“过期时间”,日期格式为mm/dd/YY |
-h,--help | 显示帮助信息,并退出 |
-I,--inactive 失效密码 | 将因过期而失效的密码设为“失效密码” |
-l.--list | 显示账户年龄信息 |
-m,--mindays 最小天数 | 将两次改变密码之间相距最小天数设为“最小天数” |
-M,--maxdays 最大天数 | 将两次改变密码之间相距最大天数设为“最大天数” |
-W,--warndays 警告天数 | 将过期警告天数设为“警告天数” |
chage实例
实例1:使用-l参数显示账户年龄信息
[root@test2 ~]# chage -l qinbf 最近一次密码修改时间 : 5月 21, 2013 密码过期时间 :从不 密码失效时间 :从不 帐户过期时间 :从不 两次改变密码之间相距的最小天数 :0 两次改变密码之间相距的最大天数 :99999 在密码过期之前警告的天数 :7 |
实例2:举一个组合参数-m、-M、-W、-I控制密码时效的例子(同passwd命令的实例3)
[root@test2 ~]# chage -l oldboy1 最近一次密码修改时间 : 6月 03, 2013 密码过期时间 :从不 密码失效时间 :从不 帐户过期时间 :从不 两次改变密码之间相距的最小天数 :0 两次改变密码之间相距的最大天数 :99999 在密码过期之前警告的天数 :7 [root@test2 ~]# chage -m 7 -M 60 -W 10 -I 30 oldboy1 [root@test2 ~]# chage -l oldboy1 最近一次密码修改时间 : 6月 03, 2013 密码过期时间 : 8月 02, 2013 密码失效时间 : 9月 01, 2013 帐户过期时间 :从不 两次改变密码之间相距的最小天数 :7 两次改变密码之间相距的最大天数 :60 在密码过期之前警告的天数 :10 |
实例3:使用-E参数修改账户有效期
#也可以使用usermod -e 06/10/13来实现 [root@test2 ~]# chage -E 06/13/13 oldboy1 [root@test2 ~]# chage -l oldboy1 …… 帐户过期时间 : 6月 13, 2013 …… [root@test2 ~]# usermod -e "" oldboy1 [root@test2 ~]# chage -l oldboy1 …… 帐户过期时间 :从不 …… |
有关用户密码失效
设置用户密码时效有利有弊,可以防止离职人员过期登录,也可以强制定期修改密码,提升系统安全性,缺点是有一些本应该保留的用户过期无法登录,再者服务器数量很大的情况下,修改密码是很大的工作量。在大规模的运维环境中,使用LDAP服务实行对linux账户统一认证,批量修改,是不错的方法。
2.4 删除用户相关命令userdel
userdel语法
userdel [-r] 用户名
总结
使用“userdel 用户名”删除用户时,仅会删除用户本身,其家目录及相关文件并不会被删除。
我们可以直接使用vi编辑/etc/passwd,找到要处理的用户吗,先注释一段时间,确认真的没问题,然后再清理其家目录,注释的作用和userdel命令删除的效果是一样的。注释取消注释之后,还可以恢复。对/etc/passwd这样重要的文件进行修改,最好先备份。
实例
[root@test2 ~]# sed -i "s/tmpuser1/\#tmpuser1/g" /etc/passwd [root@test2 ~]# grep \# /etc/passwd #tmpuser1:x:20003:20003::/home/#tmpuser1:/bin/bash [root@test2 ~]# ll -d /home/tmpuser1/ drwx------ 2 20003 tmpuser1 4096 06-03 07:08 /home/tmpuser1/ [root@test2 ~]# su - tmpuser1 su: 用户 tmpuser1 不存在
[root@test2 ~]# userdel tmpuser1 #-à没有使用参数-r [root@test2 ~]# ll -d /home/tmpuser1 #-->家目录还在 drwx------ 2 20003 20003 4096 06-03 07:08 /home/tmpuser1 [root@test2 ~]# cd /var/spool/mail/ [root@test2 mail]# ll |grep tmpuser1 #--à邮件队列还存在 -rw-rw---- 1 20003 mail 0 06-03 07:07 tmpuser1
[root@test2 ~]# tail -3 /etc/passwd
[root@test2 ~]# userdel -r oldboy3 #-à使用-r参数 [root@test2 ~]# ll -d /home/oldboy3 #-à家目录不存在 ls: /home/oldboy3: 没有那个文件或目录 [root@test2 ~]# ll /var/spool/mail/ |grep oldboy3 #--à邮件队列不存在 |
2.5 删除用户组相关命令groupdel
语法格式
groupdel 用户组
[root@test2 ~]# cat /etc/group …..
…… [root@test2 ~]# userdel oldboy2 [root@test2 ~]# ll -d /home/oldboy2 ls: /home/oldboy2: 没有那个文件或目录 [root@test2 ~]# grep oldboy2 /etc/group [root@test2 ~]# grep oldboy2 /etc/passwd |
2.6 用户信息修改相关命令usermod
usermod语法
usermod参数选项 | 注释说明 |
-c comment | 增加用户账户/etc/passwd中的注解说明 |
-d home_dir | 更新家目录,如果给定-m选项,用户旧的家目录会搬到新的家目录中去 |
-e expire_date | 加上用户账号停止日期,格式为mm/dd/yy |
-f inactive_days | 账户过期几日后永久停权,当值为-1时,则关闭此功能 |
-g install_group | 更新用户新的起始登入用户组,用户组名须已存在 |
-G group […] | 定义用户为一堆groups成员 |
-l login_name | 变更用户login时的名称为login_name。其余信息不变 |
-s shell | 指定新登入shell |
-u uid | 指定用户的UID,除非接-o参数,否则ID值必须唯一 |
-L | 冻结用户的密码,使之无法登陆,实际就是间接修改/etc/passwd的密码栏,在密码栏的开头加上“!” |
-U | 取消冻结用户的密码,使之恢复登陆,取消/etc/passwd中的“!”。 |
实例:
[root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# usermod -L oldstudent3 [root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# usermod -U oldstudent3 [root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# usermod -L oldstudent3 [root@test2 ~]# passwd -S oldstudent3
[root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# passwd -u oldstudent3 Unlocking password for user oldstudent3. passwd: Success. [root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# passwd -S oldstudent3
[root@test2 ~]# passwd -l oldstudent3 #使用passwd -l锁定 Locking password for user oldstudent3. passwd: Success [root@test2 ~]# passwd -S oldstudent3
[root@test2 ~]# usermod -U oldstudent3 #使用usermod -U解除锁定 [root@test2 ~]# passwd -S oldstudent3
[root@test2 ~]# usermod -U oldstudent3 #再次使用usermod -U解除锁定 [root@test2 ~]# passwd -S oldstudent3 #成功解除
从上面可以发现,使用usermod -U参数锁定,用passwd -l来解除锁定,只需要输入一次命令,而使用passwd -l参数锁定,用usermod -U来解除锁定,需要输入两次命令。以下可以通过分别使用两个命令,/etc/shadow文件的变化来验证。 [root@test2 ~]# passwd -l oldstudent3 Locking password for user oldstudent3. passwd: Success [root@test2 ~]# grep oldstudent3 /etc/shadow #passwd锁定一开始有两个“!”
[root@test2 ~]# usermod -U oldstudent3 [root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# usermod -U oldstudent3 [root@test2 ~]# grep oldstudent3 /etc/shadow
[root@test2 ~]# usermod -L oldstudent3 [root@test2 ~]# grep oldstudent3 /etc/shadow #usermod锁定一开始就只有一个“!”
|
总结:在众多命令中,usermod是一个不常使用,但是一个功能强大的命令。
2.7 用户查询相关命令
用户查询工具的原理也是读取与用户和用户组有关的配置文件以及相关的用户日志记录信息,然后按照一定的规则和条件输出。
2.7.1 id命令语法
id [参数] [用户名]
实例:
[qinbf@test2 ~]$ id test #普通用户也可以查看其它用户 uid=502(test) gid=502(test) groups=502(test) context=user_u:system_r:unconfined_t:s0 |
2.7.2 finger命令语法
finger [参数] [用户名]
finger命令侧重用于用户信息的查询;查询内容包括用户名、家目录、登录shell类型、用户真实的名字(name)……办公地址、办公电话等等
finger参数选项 | 注释说明 |
-l | 采用长格式 |
-m | 禁止对用户真实名字进行匹配 |
-p | 把.plan和.projet文件中的内容省略 |
-s | 显示短格式(默认项) |
实例:finger -s和w、who、last、lastlog的比较
finger是一个非常简单的命令工具,当用到-s参数时,我们可以和w、who、last、lastlog对照
[root@test2 ~]# w #显示已经登陆的用户,并且都做了什么的信息,查看信息与/var/run/utmp文件有关 10:40:09 up 33 min, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT qinbf pts/0 192.168.1.1 10:10 0.00s 0.06s 0.08s sshd: qinbf [priv]
[root@test2 ~]# who #显示哪些用户在登陆,终端及登陆时间,来源主机 qinbf pts/0 2013-06-05 10:10 (192.168.1.1)
[root@test2 ~]# users #仅显示哪些用户在登陆 qinbf
[root@test2 ~]# finger #不加参数也表示显示登陆用户的相关信息,但这个命令还可以显示其他未登陆的用户信息 Login Name Tty Idle Login Time Office Office Phone Host qinbf qinbf pts/0 Jun 5 10:10 XM35 0592-2957777 (192.168.1.1)
[root@test2 ~]# last #显示已登陆的用户列表及登陆时间等,查看的信息与/var/run/.wtmp/和/var/run/btmp两个文件有关 qinbf pts/0 192.168.1.1 Wed Jun 5 10:10 still logged in reboot system boot 2.6.18-308.4.1.e Wed Jun 5 10:07 (00:32) qinbf pts/0 192.168.1.1 Tue Jun 4 15:47 - down (09:22) reboot system boot 2.6.18-308.4.1.e Tue Jun 4 15:46 (09:23) qinbf pts/1 192.168.1.1 Mon Jun 3 19:43 - down (01:37) qinbf pts/1 192.168.1.1 Thu Jun 6 05:52 - 19:03 (-2+-10:-48) student0 pts/1 192.168.1.1 Wed Jun 5 00:00 - 00:00 (1+00:00) student0 pts/1 192.168.1.1 Wed Jun 5 00:00 - 00:00 (00:00) student0 pts/1 192.168.1.1 Mon Jun 3 00:03 - 00:00 (1+23:56) student0 pts/1 192.168.1.1 Mon Jun 3 00:02 - 00:02 (00:00) ……
[root@test2 ~]# lastlog #报告最近的所有系统用户的登录信息 用户名 端口 来自 最后登陆时间 root pts/0 192.168.1.1 四 5月 16 23:43:45 +0800 2013 bin **从未登录过** daemon **从未登录过** adm **从未登录过** lp **从未登录过** sync **从未登录过** shutdown **从未登录过** halt **从未登录过** mail **从未登录过** news **从未登录过** |
3. Linux用户身份切换命令
超级用户root具有超级管理权限,由于权限太大,如果管理不好,就会对系统安全带来安全隐患。在工作场景中,一般临时性处理工作,都是以普通用户的身份完成,只在必要时才使用超级用户root。
3.1 su命令
3.1.1 su介绍
通过su命令可以在用户之间切换,超级用户root向普通用户或虚拟用户切换不需要密码(这就是超极权限所在)。其他普通用户之间或者普通用户切换到root,都需要切换用户的秘密验证。
su参数选项 | 注释说明 |
-,-l,--login | 使一个shell成为登陆的shell,如执行su - oldboy,表示该用户改变身份为oldboy,并且使用oldboy用户的环境变量配置。 |
-c,--command=COMMAND | 切换到一个shell下,执行一个命令,然后退出所切换的用户环境 |
-m,--presserve-environment | 切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,较少使用 |
-s,--shell=SHELL | 如果/ec/shell允许,则运行指定的shell |
su实例:
[qinbf@qinbf ~]$ whoami qinbf [qinbf@qinbf ~]$ su - #输入的是root的密码 口令: [root@qinbf ~]# whoami root [root@qinbf ~]# env HOSTNAME=qinbf SHELL=/bin/bash TERM=linux HISTSIZE=1000 USER=root …… PWD=/root LANG=zh_CN.UTF-8 SHLVL=1 HOME=/root LOGNAME=root [root@qinbf ~]# su - qinbf [qinbf@qinbf ~]$ whoami qinbf [qinbf@qinbf ~]$ env HOSTNAME=qinbf SHELL=/bin/bash TERM=linux HISTSIZE=1000 USER=qinbf ……. PWD=/home/qinbf LANG=zh_CN.UTF-8 SHLVL=1 HOME=/home/qinbf LOGNAME=qinbf [qinbf@qinbf ~]$ exit # exit退出当前用户,这个命令可以用ctrl+d替换 logout
[root@qinbf ~]# |
总结:su切换到其他用户不加“-”,环境变量是不会改变的,可能会导致异常,比较规范的写法是“su - 用户”
如何让系统在每一次开机时自动普通用户启动指定的服务脚本?
把要执行的脚本放入开机自启动配置文件/etc/rc.local su - tddoc -c ‘/bin/sh /home/tddoc/bin/deploy.sh’ |
su命令优缺点
su命令为我们管理linux带来方便,但是也带来了很大的安全管理问题,切换到root身份,可以改掉root的密码,让其他用户无法再切换到root。使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择。建议使用sudo代替su。
su致命的缺点:
1) 普通用户必须知道root密码才可以切换到root,这样root密码就泄露开了。
2) 使用su命令切换身份,无法对切换后的身份做精细的控制,可以为所欲为,甚至改掉root密码。
3.2 sudo命令
通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细)授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权。
3.2.1 sudo执行的流程
1) 当用户执行sudo时,系统会首先查找/var/run/sudo/%HOME(如果是新用户会先生成此目录)目录中是否有用户时间戳文件,如果时间戳文件过期,则提示用户是否输入自身的密码(不是root或者要切换的用户密码)
2) 当密码验证成功后,系统会查找/etc/sudoers配置文件,判断用户是否有执行相应sudo命令权限
3) 如果具备执行相应sudo权限,就会自动由当前用户切换到root,然后以root身份执行该命令
4) 执行完成后,又会自动直接退回到当前用户shell下。
3.2.2 sudo语法
sudo [参数选项] 命令
sudo参数选项 | 注释说明 |
-l | 列出用户在主机上可用的和被禁止的命令 |
-v | 验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接运行sudo,可用-v可以跟踪最新的时间戳 |
-u | 指定以某个用户身份执行特定的操作 |
-k | 同-K,删除时间戳,下一个sudo命令提供密码。前提是该用户授权中不能有NOPASSWD参数 |
sudo授权的方法
1) 执行visudo命令
2) 直接修改/etc/sudoers文件
直接修改sudoers配置文件方法有以下需要注意的几点:
- echo命令是追加>>,不是重定向>,除了echo外,可以用cat、sed等命令实现此功能;
- 修改操作完成一定要执行visudo -c进行语法检查,这弥补了直接修改的不足
- 确保/etc/sudoers权限是正确的(-r--r-----),权限不对会导致sudo功能异常
- 及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口)
- 确保知道正确root用户密码,以便在出现问题时可以通过普通用户等候执行su-命令切换到root进行恢复。
3) 使用用户组的方式实现sudo授权
通过授权一个用户组的方式来配置/etc/sudoers,这样以后有增加用户需要相同的授权时,直接将用户加入到sa组就可以享受sa组的sudo授权了。
%sa ALL=(All) ALL
#注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的。
3.2.3 sudo实例:
[root@qinbf ~]# useradd sun [root@qinbf ~]# echo "qbf" |passwd --stdin sun Changing password for user sun. passwd: all authentication tokens updated successfully. [root@qinbf ~]# su - sun [sun@qinbf ~]$ touch /root/sun.txt touch: 无法触碰 “/root/sun.txt”: 权限不够 [sun@qinbf ~]$ sudo /root/sun.txt
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 sun: Sorry, try again. [sudo] password for sun: sun is not in the sudoers file. This incident will be reported.
方法一: [root@qinbf ~]# visudo 81 ## Allow root to run any commands anywhere 82 83 root ALL=(ALL) ALL 84 qinbf ALL=(ALL) ALL 85 sun ALL=(ALL) ALL #允许sun用户在任何主机、对任何用户、执行任何操作
方法二: [root@qinbf ~]# echo "sun ALL=(ALL) ALL">>/etc/sudoers [root@qinbf ~]# visudo -c #检查/etc/sudoers文件的语法 /etc/sudoers: parsed OK [root@qinbf ~]# ll /etc/sudoers #检查/etc/sudoers文件的权限 -r--r----- 1 root root 3438 06-05 15:05 /etc/sudoers
方法三: [root@qinbf ~]# grep sa /etc/group sa:x:801:oldboy6 [root@qinbf ~]# echo "%sa ALL=(ALL) ALL">>/etc/sudoers [root@qinbf ~]# usermod -G sa sun
验证: [sun@qinbf ~]$ sudo touch /root/sun.doc [sun@qinbf ~]$ sudo ls -l /root/sun.doc -rw-r--r-- 1 root root 0 06-05 15:10 /root/sun.doc |
3.3 /etc/sudoers配置文件
3.3.1 /etc/sudoers的规则大致可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。
1) Host_Alias定义主机别名
# Host_Alias FILESERVERS = fs1, fs2 # Host_Alias MAILSERVERS = smtp, smtp2 |
2) User_Alias定义用户别名
User_Alias ADMINS = jsmith, mikem |
3) Runas_Alias定义runas别名
这个别名指定的是“用户身份”,即sudo允许切换至的用户
Runas_Alias SUPER = root |
4) Cmnd_Alias定义命令别名
## Services #Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database #Cmnd_Alias LOCATE = /usr/bin/updatedb |
3.3.2 别名实例
实例1:定义用户别名
User_Alias ADMINS = oldboy, ett, %oldboy #-->定义用户别名ADMINS,包含oldboy,ett及oldboy组的成员 |
实例2:定义命令别名
Cmnd_Alias NETWORK = /sbin/ifconfig, /etc/init.d/network # 1) 所有的命令别名下的成员必须是文件或目录的绝对路径 2) 命令别名超过一行时,可以通过“\”号换行 3) 在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*。 |
实例3:定义Runas别名
Runas_Alias OP = root, oldboy 特别说明:runas别名的定义也不多见 |
3.3.3 /etc/sudoers配置文件中的授权规则
oldboy ALL=(ALL) ALL #-->授权中的所有ALL字符串必须大写。其中,第一、二个ALL字符串不大写的话,visudo语法检查可以过,但是授权实际配置达不到配置需求,最后一个ALL必须大写,否则visudo语法检查通不过。
这一行代表的意思是: 授权用户 主机=(指定的可切换的用户) 可以执行的命令动作 因此,上面一行授权内容的实际意思就是,oldboy用户可以在所有的主机上,切换到所有用户,执行所有的命令。
如果忽略上面括号的内容,如写成: oldboy ALL= ALL 那么只能切换到root执行所有命令。
如果希望在执行命令时不提示密码,就用这个NOPASSWD:ALL语法来授权 如果不希望执行某个命令,那么就在这个命令前面加上“!” |
3.3.4 /etc/sudoers配置文件授权规则实例
在/etc/sudoers文件的末尾添加以下两行: Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
test ALL=(ALL) USER_ADMIN "/etc/sudoers" 109L, 3595C 已写入 [root@test2 ~]# visudo -c /etc/sudoers: parsed OK [root@test2 ~]# ll /etc/sudoers -r--r----- 1 root root 3595 06-08 10:07 /etc/sudoers
[test@test2 ~]$ vi .bash_profile #修改test用户的环境变量,添加以下黄色部分的变量 PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[test@test2 ~]$ source .bash_profile [test@test2 ~]$ sudo useradd bifeng [sudo] password for test: [test@test2 ~]$ sudo passwd bifeng Changing password for user bifeng. New UNIX password: Retype new UNIX password: Sorry, passwords do not match. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo passwd root [sudo] password for test: Sorry, user test is not allowed to execute ‘/usr/bin/passwd root‘ as root on test2.localdomain. [test@test2 ~]$ sudo passwd [sudo] password for test: Sorry, user test is not allowed to execute ‘/usr/bin/passwd‘ as root on test2.localdomain.
再添加一行: Cmnd_Alias USER_CHANGE = /bin/chown 修改test的权限: test ALL=(ALL) USER_ADMIN, NOPASSWD: USER_CHANGE
[test@test2 ~]$ sudo /bin/chown sun.sun /root/sun.txt [test@test2 ~]$ #-----à不再需要密码提示 |
3.3.5 sudo配置文件/etc/sudoers授权规则注意事项总结:
1) 授权规则中的所有ALL字符串必须为大写字母
2) Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel,!/usr/bin/passwd、/usr/bin/passwd[A-Za-z]*,/bin/chown, !/usr/bin/passwd root
允许执行的命令是有顺序的,从老师的测试结果来看,命令的顺序是从后面向前,即把允许执行的命令放在禁止命令的后面
3) 一行内容超长可以用“\”斜线换行
4) “!”叹号表示非,就是命令取反的意思,即禁止执行的命令。
5) 测试之前要记得修改普通用户的环境变量.bash_profile文件,把root的环境变量加入到普通用户的后面。
3.3.6 远程执行sudo命令
在默认情况下,我们是无法通过ssh远程执行sudo命令的
在/etc/sudoers有这样的配置:
53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 54 # You have to run "ssh -t hostname sudo <cmd>". 55 # 56 Defaults requiretty |
根据注释我们可以知道,这个“Default requiretty”就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh sudo 命令格式为“ssh hostname sudo <cmd>”,禁止的原因是因为会明文显示密码,但是我们可以通过“ssh -t hostname sudo <cmd>”的方式
3.4 配置sudo命令审计
3.4.1 日志文件配置
1)安装sudo,syslog命令服务
yum install sudo syslog
[root@test2 ~]# yum install sudo syslog |
2)配置系统日志/etc/syslog.conf
echo “local2.debug /var/log/sudo.log”>>/etc/syslog.conf
31news.=crit /var/log/news/news.crit 32news.=err /var/log/news/news.err 33news.notice /var/log/news/news.notice 34local2.debug /var/log/sudo.log |
3) 配置/etc/sudoers
增加配置“Defaults logfile=/var/log/sudo.log”>>/etc/sudoers
4) 重启syslog内核日志记录器
/etc/init.d/syslog restart
[root@test2 ~]# /etc/init.d/syslog restart 关闭内核日志记录器: [确定] 关闭系统日志记录器: [确定] 启动系统日志记录器: [确定] 启动内核日志记录器: [确定] |
5) 测试sudo日志审计配置结果
[test@test2 ~]$ sudo useradd bill [test@test2 ~]$ sudo passwd bill Changing password for user bill. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo useradd lily [test@test2 ~]$ passwd lily passwd: Only root can specify a user name. [test@test2 ~]$ sudo passwd lily Changing password for user lily. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo chown root.root /root/sun.txt
[root@test2 ~]# tail /var/log/sudo.log 6月 8 11:02:45 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/sbin/useradd bill 6月 8 11:02:52 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/passwd bill 6月 8 11:03:32 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=list 6月 8 11:03:51 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=validate 6月 8 11:04:12 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/sbin/useradd lily 6月 8 11:04:22 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/passwd lily 6月 8 11:07:04 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/bin/chown root.root /root/sun.txt |
3.5.2 日志写到其他主机:
SYSLOGD_OPTIONS=”-m O -r -x” # -r是指接收远程日志的意思 重启syslog服务器 /etc/init.d/syslog restart
编辑/etc/syslog.conf 修改 local2.debug /var/log/sudo.log 修改为 local2.debug @中央服务器的IP |
4. Linux系统集权分治管理sudoer配置案例
4.1完成本案例,可以在增加以下项目经验:
服务器用户权限管理改造方案与实施项目
- 提出权限整改解决方案改进公司超级权限root泛滥的现状
- 召集大家开会讨论确定方案后推进实施
- 实施后使得公司的权限管理更加清晰了
4.2问题现状
公司服务器管理人员多,(开发+运维+架构+DBA+产品+市场),使用Linux服务器时,不同职能的员工操作不规范,root权限泛滥
4.3 项目需求
既希望超级用户root密码掌握在少数或者唯一的管理员手中,又希望多个系统管理员有相关权限
4.4 实施方案
4.4.1 信息采集
1.1 召集相关各部门领导通过会议讨论或是与各组领导沟通确定权限方案的可行性
需要支持人员:运维经理、CTO支持、各组的领导。我们作为运维人员,拿着类似老师给大家讲解的这个文档,通过会议形式做演讲,慷慨激昂的演说,取得大佬们的支持
1.2 汇总、提交、审核所有相关员工对Linux服务器的权限需求
取得大佬们的支持后,通过发邮件或者联系相关人员取得需要的信息。比如说,让各个部门的经理整理归类本部门需要权限的人员名单、职位及对应的业务及权限
1.3 按照linux命令及服务规划权限
主要是运维人员根据上面手机的名单,对应账号配置权限
1.4权限方案实施后,所有员工必须通过《员工Linux服务器管理权限申请表》来申请对应的权限,确定审批流程,规范化管理。
4.4.2收集员工职能和对应权限
1)初级运维3名
权限分配:普通用户的权限,所管理的服务器的ALL权限,但是排除一些危害及切换root的权限
Cmnd_Alias C_CMD_1 = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root, !/sbin/fdisk, !/sbin/parted, !/bin/rm, !/bin/su, !/usr/sbin/visudo, !/usr/bin/vi * *sudo*, !/bin/vi*sudo* |
2) 运维经理和高级运维:各一名
权限分配:普通用户的权限,所管辖的服务器的ALL权限
4) 网络工程师:1名
权限分配:普通用户的权限,查看网络配置,并排除故障的权限
Cmnd_Alias N_CMD_1 = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/cat, /var/log/* |
5) 普通开发:10名
权限分配:普通用户的权限,对应服务的查看日志的权限,重启对应服务权限
大公司:项目负责制的规定
Cmnd_Alias P_CMD_1 = /bin/cat ~/log/*, /bin/cat /var/log/message, /bin/cat /app/log/*, /bin/sh / ~/scripts/deploy.sh |
4.4.3 创建用户角色
建立3个初级运维,一个网络工程师,一个运维经理,一个高级运维经理的用户,密码是111111
for user in chuji001 chuji002 chuji003 net001 senior001 manager001 do useradd $user echo “111111” | passwd --stdin $user done |
建立10个开发人员,属于phpers组
groupadd -g 999 phpers for n in `seq 10` do useradd -g phpers php00$n done |
4.4.4 sudoers配置内容
事先要备份/etc/sudoers文件,cp/etc/sudoers /etc/sudoers.ori
##Cmnd_Alias by oldboy##2012 Cmnd_Alias C_CMD_1 = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root, !/sbin/fdisk, !/sbin/parted, !/bin/rm, !/bin/su, !/usr/sbin/visudo, !/usr/bin/vi * *sudo*, !/bin/vi*sudo*
Cmnd_Alias N_CMD_1 = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/cat, /var/log/*
Cmnd_Alias P_CMD_1 = /bin/cat ~/log/*, /bin/cat /var/log/message, /bin/cat /app/log/*, /bin/sh / ~/scripts/deploy.sh ## User_Alias by oldboy###2012 User_Alias ADMINS = senior001, manager01 User_Alias CHUJIADMINS = chuji001, chuji002, chuji003 User_Alias NETADMINS = net001 User_Alias PROGRAMERS = %phpers
##Runas_Alias by oldboy##2012/11/30 Runas_Alias SUUSER = root
#pri config ADMINS ALL=(ALL) NOPASSWD:ALL CHUJIADMINS ALL=(SUUSER) NOPASSWD:ALL,C_CMD_1 NETADMINS ALL=(SUUSER) NOPASSWD:N_CMD_1 |
PROGRAMERS ALL=(SUUSER) NOPASSWD:P_CMD_1 |
Linux课程笔记 Day04 课上内容总结