<权限>系统用户和用户组

时间:Feb. 16, 2017 分类:

目录:

系统用户分类

用户分类 UID
超级用户 0
系统用户 1~499
普通用户 500~65535

相关配置文件

/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow

相关命令

useradd 添加用户
userdel 删除用户和用户相关的配置或文件
passwd  设置密码
chage   修改用户密码有效期
usermod 修改用户的命令
id      查看UID,GID及归属的用户组
su      用户切换命令
sudo    用户提权的命令
visudo  编辑/etc/sudoers
groupadd    添加组
groups      

添加新用户

[root@why-1 ~]# useradd why01
[root@why-1 ~]# su - why01
[why01@why-1 ~]$ pwd
/home/why01
[why01@why-1 ~]$ logout

添加新用户会把下的所有文件拷贝到新添加用户的家目录

ll /etc/skel -a
cat /etc/login.defs
MAIL_DIR    /var/spool/mail #定义邮件收发
PASS_MAX_DAYS   99999       #密码过期时间
PASS_MIN_DAYS   0
PASS_MIN_LEN    5           #密码最小长度
PASS_WARN_AGE   7           #警告时间
UID_MIN           500       #用户最小UID
UID_MAX         60000       #用户最大UID
GID_MIN           500
GID_MAX         60000
CREATE_HOME yes             #是否创建家目录
UMASK           077         #
USERGROUPS_ENAB yes         #删除用户时删除对应组
ENCRYPT_METHOD SHA512       #密码加密算法
cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home              #家目录建立目录
INACTIVE=-1             #是否启用账户过期停权,-1代表不启用
EXPIRE=                 #账号终止日期
SHELL=/bin/bash         #新用户默认shell
SKEL=/etc/skel          #默认文件存放路径
CREATE_MAIL_SPOOL=yes   #创建mail文件

可以通过useradd -D查看,useradd -D指定参数来修改,当然不怎么实用,就不列了,可以通过man useradd查看

useradd命令详解

  • -c用户注释
  • -d账户每次登陆的home目录
  • -e指定账号终止日期,格式为MM/DD/YY
  • -g指定用户属于哪个组
  • -G可以一次性指定多个组
  • -m指定用户home目录,如果不存在则创建
  • -M不建立home目录,并且优先于/etc/logins.defs文件配置
  • -s指定用户登录的shell
  • -u指定用户uid

创建用户并指定过期时间

[root@why-1 ~]# /usr/sbin/ntpdate pool.ntp.org
13 Feb 23:18:52 ntpdate[16572]: step time server 173.255.246.13 offset 2478914.102675 sec
[root@why-1 ~]# hwclock
2017年02月14日 星期二 07时19分00秒  -0.213053 seconds
[root@why-1 ~]# useradd -e "2017/02/14" why02
[root@why-1 ~]# chage -l why02
Last password change                    : Feb 13, 2017
Password expires                    : never
Password inactive                   : never
Account expires                     : Feb 14, 2017
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7
[root@why-1 ~]# tail -1 /etc/shadow
why02:!!:17210:0:99999:7::17211:

groupadd 命令详解

-g指定GID -r建立系统用户组,小于500 -f如果用户组存在,强制覆盖用户组账户

passwd命令详解

一般常用的就passwd --stdin通过非交互式设置密码

[root@why-1 ~]# passwd why02
更改用户 why02 的密码 。
新的 密码:
无效的密码: 过于简单化/系统化
无效的密码: 过于简单
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。
[root@why-1 ~]# passwd -l why02
锁定用户 why02 的密码 。
passwd: 操作成功
[root@why-1 ~]# su - why02
[why02@why-1 ~]$ passwd
更改用户 why02 的密码 。
为 why02 更改 STRESS 密码。
(当前)UNIX 密码:
passwd: 鉴定令牌操作错误
[root@why-1 ~]# passwd -u why02
解锁用户 why02 的密码 。
passwd: 操作成功

以上状态可以通过-S是查看状态,余下命令:

  • -d清除密码
  • -k保留即将过期的账户在期满后仍能使用
  • -n两次修改密码的最小天数
  • -x两次修改密码的最大天数
  • -w在距多少天提醒用户修改密码
  • -i在用户过期后多少天,用户被禁掉

7天内不能修改密码,60天后必须修改密码,过期前10天提醒,过期后30天禁止登录

[root@why-1 ~]# passwd -n 7 -x 60 -w 10 -i 30 why02
调整用户密码老化数据why02。
passwd: 操作成功
[root@why-1 ~]# chage -l why02
Last password change                    : Feb 13, 2017
Password expires                    : Apr 14, 2017
Password inactive                   : May 14, 2017
Account expires                     : Feb 14, 2017
Minimum number of days between password change      : 7
Maximum number of days between password change      : 60
Number of days of warning before password expires   : 10

chage命令详解

  • -d修改密码时间设置为最近时间
  • -E设定账户的过期时间,格式为MM/DD/YY
  • -I将因为过期而失效的免密设为失效密码
  • -l显示账户年龄信息
  • -m两次改变密码之间的最小间隔
  • -M两次改变密码之间的最大间隔
  • -W将要过期警告天数
[root@why-1 ~]# chage -l root
Last password change                    : Feb 13, 2017          -d
Password expires                    : never                     -E
Password inactive                   : never                     -I
Account expires                     : never
Minimum number of days between password change      : 0         -m
Maximum number of days between password change      : 99999     -M
Number of days of warning before password expires   : 7         -W

可以看到passwd,chage,useradd都是通过操作/etc/shadow实现的,更多的权限可以通过LDAP来进行共同以管理

userdel

用户登录的过程中无法删除 userdel -r删除用户的同时删除home目录,当然也可以注释掉/etc/passwd文件实现删除用户

groupdel

用户组为一个用户的主组的话是无法删除的,必须删除这个用户才行

usermod

修改用户信息,凡是添加的信息都可以进行修改 -c修改注释 -d修改home目录 -e修改用户账户停止日期,日期格式为MM/DD/YY -f修改账户过期几日后永久停权 -g更新用户新的起始登录组,用户组必须存在 -G定义用户为多个组的成员,每个用户组使用","逗号隔开 -l更改用户登录的用户名,其余信息不变,例如usermod -l why02 why03 -s指定登录的shell -u9更改uid -L冻结用户密码修改 -U取消冻结用户密码修改

其他命令

[root@why ~]# id why            #查看用户的uid和gid等信息
uid=500(why) gid=500(why) groups=500(why)
[root@why ~]# w                 #查看详细当前登录情况
 16:41:51 up 34 days, 21:54,  1 user,  load average: 0.14, 0.05, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    223.223.188.66   16:31    0.00s  0.01s  0.00s w
[root@why ~]# who               #查看当前登录情况
root     pts/0        2017-02-14 16:31 (223.223.188.66)
[root@why ~]# last              #查看登录情况
root     pts/0        223.223.188.66   Tue Feb 14 16:31   still logged in   
root     pts/0        123.122.66.104   Mon Feb 13 20:31 - 00:56  (04:24)    
root     pts/1        223.223.188.66   Mon Feb 13 11:28 - 18:42  (07:14)    
root     pts/0        223.223.188.66   Mon Feb 13 10:40 - 18:42  (08:02)    
[root@why ~]# groups why        #查看当前用户组
why

用户身份切换

su

-切换环境变量su - [user] -c以某一用户权限执行命令su -c [user] [command],如果在rc.local等脚本中执行可以用su - [user] -c [command] 不过su也有缺点

sudo

sudo命令的原理 普通用于在执行sudo命令,会检查6.x版本在/var/db/sudo/下5.x版本在/var/run/sudo/下是否有时间戳文件,如果有检验是否过期,过期的话需要用户输入自己的用户口令,如果没过期就不需要,然后根据sudoers的配置文件是否有执行命令的权限,有权限的话,执行命令并返回结果并退出,如果没有则直接退出。 过期时间默认为5分钟,可以通过man sudoers查看。

命令详解

sudo -l查看用户所有的权限 sudo -v追踪最新的时间戳 sudo -u以某个用户身份执行特定的命令 sudo -k删除时间戳,下一个sudo命令需要输入密码,前提是该用户授权中不能有NOPASSWORD参数

/etc/sudoers配置文件详解

一般通过visudo修改,等价于vim /etc/sudoers,但是没有检查语法的功能,需要用visudo -c来检查。

前面是一些别名,主机别名,用户别名,命令别名等,从98行开始是我们需要的

root    ALL=(ALL)       ALL

第一列为用户或者组,如果是组用%开头。第二列为MACHINE=COMMANDS,第一个ALL代表所有机器,也可以写localhost,第二个括号为指定命令所用用户,如果不添加也为root,第三列为可执行的命令,ALL代表全部命令,也可以使用全路径单独添加,多个用","隔开即可。不需要密码执行的命令通过"NOPASSWD:参数"进行设置,如果配置成组,只要这个用户在这个组里,就有这个权利

然后在说别名

主机别名

# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

注意等号两端有空格,取消注释后,这个FILESERVER就可以写到上述第二列的MACHINE的位置,fs1和fs2两台主机就可以通过ssh远程执行sudo,不过要指定-t参数说着注释掉Defaults requiretty

用户别名

# User_Alias ADMINS = jsmith, mikem

类似于用户组,这个类似于组的概念,但是别名中也可以添加组,在组名前加"%"实现即可

用户身份别名

Runas_Alias OP = root

这个没有定义过,但是确实有,正样可以添加到第二例的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

命令别名可以写入多个命令,组成命令组,我们可以将其写入到第三列中,用","隔开。命令可以使用正则匹配,例如/usr/bin/passwd [A-Za-z]*,也可以做非命令,例如ALL,!/sbin/reboot。

可以给不同的人员生成不同的命令,如果需要其他人员的命令,可以通过加入对应命令组实现该功能

公司超级用户权限泛滥解决方案

  • 起因:是公司root权限泛滥,经常会出现文件莫名其妙丢失的情况,突然有重要数据被删除,没有人承认。
  • 分析:所有人都是root权限,新老员工对服务器的认知度不全,linux命令的使用方法不准确,使得集群出现很大的不稳定因素和操作安全隐患,为了防止这个问题再次发生,产生了集中权限解决方案。
  • 解决方案:首先就是确定公司人员分组,根据分组人员使用服务器功能定制权限和权限组,并定制权限申请流程以及权限申请表格。

我们需要做到的就是让超级用户密码掌握在少数或唯一一个人手里,根据员工的工作职能进行分组(例如开发,运维,架构,DBA,产品,市场),分级实现Linux服务器管理权限的最小化,并且多个系统管理人员能正常完成复杂的自身职能相关的工作而不产生越权操作导致的安全隐患。

解决方式:

  1. 剔除问题和初步解决方案,获得公司领导支持和推动,经过运维人员牵头,并且和各个部门管理人员,骨干技术人员商议具体权限
  2. 根据业务负责人确定权限需求或业务细节,列出不限于人员,职位,业务,权限的表格,制定详细可行性方案,细化到所有可以操作该服务器集群的人
  3. 根据方案配置sudo配置文件
  4. 写好操作说明,对部门讲解和培训,sudo执行命令,涉及到环境变量的问题提前处理
  5. 权限指定后,申请权限要根据申请流程以及权限申请表格进行申请,另外流程不要过于复杂,权限申请表格中减少不必要的填写,作为一个会写程序员,最讨厌的就是这些复杂的东西了

运维组

级别 权限
普通运维 /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig,/bin/netstat,/sbin/route
高级运维 /usr/bin/free,/usr/bin/iostat,/usr/bin/top,/bin/hostname,/sbin/ifconfig,/bin/netstat,/sbin/route,/sbin/iptables,/etc/init.d/network,/bin/nice,/bin/kill,/usr/bin/killall,/bin/rpm,/usr/bin/up2date,/usr/bin/yum,/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount
运维经理 ALL

开发组

级别 权限
初级开发 /usr/bin/tail /app/log*,/bin/grep /app/log*,/bin/cat,/bin/ls
高级开发 /sbin/service,/sbin/chkconfig,/usr/bin/tail /app/log*,grep /app/log*,/bin/cat,/bin/ls
开发经理 ALL,!/usr/bin/passwd root,!/usr/bin/visudo,!/bin/vi,!/usr/bin/vim,!/bin/su

网络人员

级别 权限
网络工程师 /sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net,/sbin/iptables,/usr/bin/rfcomm,/usr/bin/rfcomm,/usr/bin/wvdial,/sbin/iwconfig,/sbin/mii-tool,/bin/cat /var/log/*

上面只是给一个思路,仅供参考,然后通过多台主机rsync等进行分发配置文件,开始肯定会想不全,但是通过一段时间的磨合,可以让运维更好的熟悉的业务,并有所提高,需要注意的问题就是:别名要大写,命令路径要全路径,用"\"换行

当然给ALL就会有一些问题,例如下载一个新的编辑器进行通过sudo编辑,还有cat后echo覆盖等等,需要考虑的非常非常周到,所以不建议用ALL去一个一个的禁止,而是确定全面并且要什么权限再给什么权限

不是特别紧急的需求,一律按着流程申请,特殊情况特殊对待嘛。