目录
1、用户,组,名称解析,权限,安全上下文,
2、useradd,userdel,usermod,passwd,id,chfn,chsh,chage,finger,
3、/etc/passwd,/etc/shadow,/etc/skel,/etc/default/useradd,/etc/login.defs
3、groupadd,groupdel,groupmod,gpasswd,newgrp
4、/etc/group,/etc/gshadow
5、su
一、概念理解
1、用户和组
为什么要有用户?
为了实现有限资源的合理分配
用户名是什么?
标识符
登录计算机:
用户名:
用户标识符:
用户名、用户ID
密码:
认证机制的一种
进程(动态):以特定用户身份运行
文件(静态的):以属主,属组等从属关系
组:将多个用户与权限建立关联关系的容器
权限:资源的支配边界
用户有两类:
管理员:root UID:0
普通用户:UID:1-65535
系统用户: #仅用于运行某些服务类进程而存在,一般不用于登录系统
CentOS6 UID:1-499
CentOS7 UID:1-999
普通用户: #能交互式登录系统
CentOS6 UID:500+
CentOS7 UID:1000+
组有两类:
管理员组:root GID:0
普通组:GID 1-65535
系统组:
GID 1-499
GID 1-1000
普通组:
GID 500+
GID 1000+
组的类别:一个用户可同时属于多个组
以用户为中心:
基本组
附加组
名称解析
把用户名解析为UID,或UID解析为用户名,基于名称解析库,以某个字段为搜索键(搜索标准),这些库文件位于/lib64,/usr/lib64目录(64位系统),通常以libnss开头。
2、权限
权限对于目录和文件的意义不同:
权限 文件 目录
r:readable 可使用查看工具看内容(cat,more) 可以使用ls命令列出其内部所有文件或子目录的相关信息
w:writable 可编辑其内容 可在此目录内创建或删除文件
x:executable 可将此文件提请内核启动为进程 可以cd进此目录,可以使用ls -l查看其内部所有文件或子目录的相关详细信息
安全上下文
用户启动某进程访问某文件资源时,权限匹配机制:
1、首先查看此进程的属主,与被访问的文件的属主是否是同一个用户,如果是,则以被访问的文件的属 主的身份来访问,从而应用权限为属主的权限,如果不是,则2
2、查看此进程的属主是否属于被访问的文件的属组,如果是,则以被被访问的文件的属组的身份来访 问,从而应用权限为属组的权限,如果不是,则应用其它人的权限
二、用户管理
useradd,passwd,userdel,usermod
1、用户管理命令
useradd:
useradd [OPTION]... USERNAME
-u UID 指定UID
-g GID 指定基本组的GID,也可使用组名,GID或组名必须事先存在
-G GID 指定附加组的GID,也可使用组名,GID或组名必须事先存在
-c 指定注释信息
-d 指定家目录
-s 指定使用的shell
-r 创建系统用户
默认不创建该用户的家目录,但是shell为/bin/bash,还是可以登录系统,所有创建系统用户时,应该使用useradd -r -s /sbin/nologin USERNAME
-m 必须给用户创建家目录
-M 不给用户创建家目录
-D 打印或设定用户创建时useradd的默认行为:
注意:创建用户时如果没有指定基本组,则useradd会自动添加一个与当前用户同名的组,且GID一般同UID
[root@Node3 ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
passwd
修改密码,centos默认不允许没有密码的用户登录
passwd 修改自己的密码
passwd USERNAME:修改指定用户的密码,只有管理员root有此权限
-l 锁定帐号
-u 解锁帐号 更改此帐号的密码也可解锁
-S 查看用户密码状态
--stdin 从标准输入读取令牌(只有根用户才能进行此操作)
-x, --maximum=DAYS 密码的最长有效时限(只有根用户才能进行此操作)
-n, --minimum=DAYS 密码的最短有效时限(只有根用户才能进行此操作)
-w, --warning=DAYS 在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
-i, --inactive=DAYS 当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
[root@localhost ~]# echo '123321'|passwd --stdin xiewei 更改用户 xiewei 的密码 。 passwd: 所有的身份验证令牌已经成功更新。
userdel
删除用户
userdel [-r] USERNAME 删除指定用户
-r:删除用户的同时,删除其家目录
usermod
修改用户信息
usermod [options] USERNAME
-g 修改用户的基本组
更改了用户的基本组那么,该用户的之前基本组不会变成该用户的附加组(id命令查看)
-G 修改用户的附加组 注意:会修改用户的之前的附加组
-a 添加附加组而不会改变原有的附加组,但是-a一定要放在-G前面,否则报错
-s 修改用户的默认shell
-c 修改用户的注释信息
-L 锁定帐号
-U 解锁帐号
-M 不给用户创建家目录
-d 修改用户的家目录,-m 修改家目录后把家目录原文件复制新位置
-l 修改用户的登录名 #但是家目录不会更改,用户不能交互式登录,组名,uid,gid不变
id
id [OPTION] [USERNAME]
显示指定用户或当前用户(当未指定用户时)的用户与组信息:UID ,基本组,所属附加组
-u 仅显示UID
-g 仅显示基本组
-G 显示所有组包括基本组和附加组
-n, --name 显示组名称而非数字,与-ugG 一起使用
[root@Node3 ~]# id uid=0(root) gid=0(root) 组=0(root) [root@Node3 ~]# id xj uid=500(xj) gid=500(xj) 组=500(xj) [root@Node3 ~]# usermod -G hello xj [root@Node3 ~]# id xj uid=500(xj) gid=500(xj) 组=500(xj),493(hello) [root@Node3 ~]# id -n xj id: cannot print only names or real IDs in default format [root@Node3 ~]# id -u xj 500 [root@Node3 ~]# id -u -n xj xj [root@Node3 ~]# id -g -n xj xj [root@Node3 ~]# id -G -n xj xj hello
chage
修改用户帐号密码的过期信息
-l 查看用户的过期信息
-d 修改密码最后一次更改日期(/etc/shadow第三个字段)
chage -d 0 USERNAME #这个命令其实是把密码修改日期归0了,这样用户一登陆就要修改密码了
[root@Node3 ~]# chage -l xj Last password change : Nov 29, 2016 Password expires : never Password inactive : never Account expires : never 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
finger
查看用户信息
finger USERNAME
[root@Node3 ~]# finger xj Login: xj Name: Directory: /home/xj Shell: /bin/bash On since 三 11月 30 07:27 (CST) on pts/2 from 192.168.10.10 2 hours idle No mail. No Plan. [root@Node3 ~]# finger root Login: root Name: root Directory: /root Shell: /bin/bash On since 三 11月 30 06:16 (CST) on pts/1 from 192.168.10.10 2 hours 33 minutes idle On since 三 11月 30 09:09 (CST) on pts/3 from 192.168.10.10 On since 一 11月 28 21:39 (CST) on tty1 1 day 11 hours idle On since 一 11月 28 23:14 (CST) on tty6 1 day idle On since 三 11月 30 06:16 (CST) on pts/0 from 192.168.10.10 1 hour 37 minutes idle On since 三 11月 30 09:09 (CST) on pts/4 from 192.168.10.10 9 minutes 30 seconds idle On since 三 11月 30 09:09 (CST) on pts/5 from 192.168.10.10 9 minutes 26 seconds idle Mail last read 日 11月 27 22:18 2016 (CST) No Plan.
chsh 修改shell
-l 列出当前系统上可用shell
-s 修改为指定shell
[root@Node3 ~]# chsh Changing shell for root. New shell [/bin/bash]: ^C [root@Node3 ~]# chsh -l /bin/sh /bin/bash /sbin/nologin /bin/dash
chfn 修改用户注释信息
[root@Node3 ~]# chfn Changing finger information for root. Name [root]: Office []: Office Phone []: Home Phone []: a Finger information changed.
2、用户相关的配置文件
/etc/passwd
密码文件
xj:x:500:500::/home/xj:/bin/bash xiewei:x:501:501:dd:/home/xiewei:/bin/bash
共7个字段
用户帐号:密码占位符:UID:用户所属的基本组的ID:用户注释信息:用户家目录位置:用户的默认shell
注意:
不写shell可以登录,但没有正确的命令提示符,写一个不存在的shell或/sbin/nologin,无法登录
没有家目录也可以登录,但没有正确的命令提示符,登录后的目录为/
使用useradd创建用户默认行为相关的配置文件:
/etc/default/useradd 定义useradd添加帐号时,默认设置帐号的信息如:家目录,家目录下的文件等
/etc/login.defs 是设置用户帐号限制的文件,在这里我们可配置密码的最大过期天数,密码的最大长度约束等内容。该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准
/etc/skel 家目录下的文件(隐藏文件)
[root@Node3 ~]# cat /etc/default/useradd #useradd -D 改变的就是这个文件的内容 # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel #家目录下的文件就是从这个目录下的文件复制过去的 CREATE_MAIL_SPOOL=yes #创建邮箱队列 [root@Node3 ~]#
/etc/shadow
影子密码文件
xj:$6$R1ac1Gw8$lSgnc4HYxPqm9IgW6TPDCd6mdqaqOqN1IxjAzGzesUTxjXkYyN7SksPaUoou0zJSFaLcWyOTxj45/KtNsKNXO1:17134:0:99999:7::: xiewei:!!:17134:0:99999:7::: xiena:!!:17134:0:99999:7:::
/etc/shadow文件每行共9个字段,各字段解释如下:
用户名:
加密后的密码串:
!!表示该帐号没有密码,使用passwd -l 锁定用户就是在密码串之前加!!就无法交互式登录,
最近一次修改密码的日期:
时间戳:起始于1790.1.1至上次密码修改所经过的天数
密码的最小使用期限:(改完密码后再次修改密码的间隔时间)
0表示不限制,按天计算,相对于上次修改密码的日期而言的相对时长
密码最大使用期限:(用了这么久后就必须改密码)
99999表示不限制,相对于上次修改密码的日期而言的相对时长
密码警告期限:(在该密码使用了最大使用期限的倒数7天,开始告警,提醒用户更改密码)
0表示不警告,默认是倒数7天警告
密码的非活动区限:(在这个范围内,用户一旦登录一定要修改密码,否则操作不了)
超过该区限,帐号将被锁定,0和默认是表示密码过期后立即失效,-1表示密码永远不会失效
帐号的过期期限:()
为一个日期(天),时间戳,
预留字段:
加密
明文 <----> 密文
解密
常用的加密算法:
加密一般不依赖于算法,依赖于密钥
对称加密:加密和解密的过程,使用同一个密钥
优点:速度快,
缺点:密钥分发困难,无法作身份认证
公钥加密(非对称加密):密钥都成对出现,使用公钥加密的,只能使用私钥加密,公钥产生于私钥之中,
缺点:速度非常慢,无法作身份认证,很少用来作数据加密
单项加密:仅能由明文产生密文,反之不成;严格意义上来讲,提取数据的特征码
使用同一个算法,多次计算得到的结果一定相同;所以经常用于验证数据完整性
定长输出:无论源数据大小是什么,加密后结果输出大小相同
雪崩效应:源数据一个微小的改变,结果将变化巨大
加盐(随机码):这样保证了不同用户使用相同的密码,但密码加密后的字符串仍然不同
常用的单项加密算法:
md5:message digest(信息摘要) 结果128bits
sha1:secure hash algorithm(安全哈希算法) 160bits sha256,sha512,
centos6用的就是sha512的算法输出
root:$6$mHjAkW0/LvGRuwLG$.5RxIIgi16uqNUsGGJWTxeMygTVNqImgWkEMYR8FJKeoLIZnc4Y5uctA/jJgVa.50tevX/96yq94iSSeMTIrk.:17018:0:99999:7:::
其中shadow中存放的密码密文格式如下:
$id$salt$encrypted
其中id是指使用的哈希算法():
1 | MD5
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
salt:是使用上面hash算法对密码进行hash的一个干扰值。
encrypted: 这个值即密码的hash, 但不是直接的hash("passwd"),而是hash("passwd+salt")后,再经过编码。
三、组管理
1、组管理相关的命令
groupadd,gpasswd,groupdel,groupmod
groupadd
groupadd [options] GROUPNAME 删除指定组
-g GID 指定使用的GID
-r 创建系统组
gpasswd
为组添加密码
gpasswd [option] GROUP
-a 添加附加用户
-d 删除指定的附加用户
-A:指定管理员
-M:指定组成员和-A的用途差不多
-r:删除密码
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组
gpasswd -A peter users
groupdel
删除组
groupdel GROUPNAME
groupmod
修改组属性
groupmod [options] GROUPNAME
-g 修改GID
-n 修改组名
newgrp
newgrp [-] [组]
切换当前用户的基本组为指定组,如果该组为该用户的附加用户则不用输入组密码,否则需要组密码(该组没设密码就切换不了) #重启后失效
2、组相关的配置文件
/etc/group
xiewei:x:501: xiena:x:502: hello:x:493:xj
组名:组密码占位符:组ID:以此组为附加组的用户列表,以逗号分隔
/etc/gshadow
nihao:!:: anyfish:!::xj
组名:组密码加密后的字符串:组管理员:组用户
四、su命令使用
su
switch user 切换用户
su [选项]... [-] [用户名 [参数]... ]
用户省略时,表示切换为root
- 省略时,表示非登陆时切换,意味这仍然使用原用户的环境设定
使用 - ,登陆时切换,意味着使用目标用户的环境设定,原用户失效
su -l 用户名 作用等同- 登陆时切换
注意:
返回原用户,使用exit或logout
root su 任何用户都不需要密码,普通用户su需要验证切换的目标用户的密码
su - 用户名 -c 'COMMAND' 以目标用户身份执行一次命令后退出,不作真正切换
#这个在使用特定用户开机启动某程序经常用到
一次用户创建经历的详细过程:
1、在/etc/passwd文件中添加一行信息
USERNAME:x:UID:GID:c:/home/USERNAME:shell
2、在/etc/group文件中添加一行信息
GROUPNAME:X:GID:附加用户
3、创建家目录/home/USERNAME
复制/etc/skel目录中的隐藏文件至用户的家目录中,并修改其属主,属组及权限
4、在/etc/shadow创建用户密码及相关属性信息
知道了这个过程我们就完全可以手动创建一个用户了
五、sudo
sudo:
将一些管理命令授权给某些普通用户使用,并且还能限定其仅能够在某些主机上执行此类的命令,操作过程还会被记录与日志中,以便于日后审计
使用sudo的过程:
1、定义sudo授权:/etc/sudoers
语法格式:
who which_host=(whom) command
谁能以谁的身份,在那些主机上执行哪些些命令,
命令要写绝对路径,普通用户使用时也使用绝对路径
如果授权给普通用户的管理员命令较多,都列在这一行里很不方便,可以使用sudo的别名机制(只在/etc/sudoers文件中有效):
别名:仅能使用纯大写字母
Host_Alias:定义主机别名,使用","分隔
可以使用主机名,ip地址,长\短网络地址
User_Alias:定义用户别名,可以是用户名,也可以是组名(%组名)
Cmnd_Alias:定义命令别名,可以定义不能执行的命令,使用!/usr/bin/passwd root
Runas_Alias:定义以哪些用户执行
别名还可以嵌套使用
编辑/etc/sudoers文件:
vim /etc/sudoers:
visudo命令:visudo是调用vi编辑命令,保存后会检查语法,有措时会提示
例子:
[root@Node1 ~]# visudo # 在最后添加该行 xj ALL=(root) /usr/sbin/useradd # 以普通用户xj登录 [xj@Node1 ~]$ useradd gentoo -bash: /usr/sbin/useradd: Permission denied [xj@Node1 ~]$ sudo useradd gentoo 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 xj: [xj@Node1 ~]$ id gentoo uid=505(gentoo) gid=505(gentoo) groups=505(gentoo) [xj@Node1 ~]$ sudo /usr/sbin/useradd rhel [xj@Node1 ~]$ id rhel uid=506(rhel) gid=506(rhel) groups=506(rhel) [xj@Node1 ~]$ sudo userdel gentoo # 没授权的管理员命令还是使用不了 Sorry, user xj is not allowed to execute '/usr/sbin/userdel gentoo' as root on Node1.
标签:
NOPASSWD:定义之后的命令在执行时可以不输入密码
PASSWD:定义用户执行命令时需要输入密码
例子:
xj ALL=(root) NOPASSWD:/usr/sbin/useradd
2、sudo命令的使用
sudo
-l:可以查看sudo模式可以执行的命令
-k:将会强迫用户在下一次使用sudo命令时必须输入密码
sudo会记住用户输入的密码,超时时间5分钟在后续操作时可以不用输入密码,超时5分钟就需要再次输入密码
[xj@Node1 ~]$ sudo -l Matching Defaults entries for xj 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 xj may run the following commands on this host: (root) /usr/sbin/useradd
练习:
授权jerry用户能够以管理员的身份基于sudo执行ifconfig,后面两个命令在执行时需要输入密码,而前两个不需要。