linux 用户与分组
以下内容参考于Linux系统的用户和用户组管理
用户
linux中每个用户都有一个uid和gid,每个用户都有一个唯一的uid,其中root用户的uid和gid都是0.用户分为三类,如下所示
超级用户root(0)
程序用户(1~499)
普通用户(500~65535)
- 超级用户:
默认是root用户,其UID和GID均为0。在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,
拥有最高的管理权限。在生产环境,一般禁止root账号远程登录SSH连接服务器,以加强系统安全。
- 程序用户:
与真实用户区分开来,这类用户的最大特点是安装系统后(或某些程序安装时)默认就会存在的,且默认情况不能登录系统,它们是系统正常运行必不可少的,
他们的存在主要是方便系统管理,满足相应的系统进程都文件属主的要求。例如系统默认的bin、adm、nodoby、mail、nginx用户等。由于服务器角色的不同,
有部分用不到的系统服务被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)。
- 普通用户:
这类用户一般是由具备系统管理员root的权限的运维人员添加的,程序开发者一般拥有的都是此类用户.
分组
简单的说,linux系统中的用户组(group)就是具有相同特性的用户(user)集合;
有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件或目录,如果不用用户组,这种需求在授权时就很难实现。如果使用用户组就方便多了,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。
将用户分组是linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。
- 用户和组之间可以有如下关系
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。比如,root。
一对多:即一个用户可以存在多个组中,这个用户就具有这些组。
多对一:即多个用户可以存在一个组中,这些用户这些组的共同权限。
多对多:即多用户可以存在于多个组中。并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展。
用户及用户组配置文件介绍
Linux系统中下的账户文件主要有/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow四个文件
与用户相关的配置文件
/etc/passwd: #用户的配置文件, 保存用户账户的基本信息
/etc/shadow #用户影子口令文件
/etc/passwd 文件
/etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,各内容之间又通过”:”号划分了7个字段,这7个字段分别定义了账号的不同属性,passwd文件实际内容如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
- 每行以:分割可以得到7个字段,其含义如下:
字段1:帐号名,这是用户登陆时使用的账户名称,在系统中是唯一的,不能重名
字段2:密码占位符x;早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了。
这里可以看到一个字母x,表示该用户的密码是/etc/shadow文件中保护的。
字段3:UID;范围是0-65535
字段4:GID;范围是0-65535;当添加用户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组。
字段5:用户说明;这个字段是对这个账户的说明
字段6:宿主目录;用户登陆后首先进入的目录,一般与"/home/用户名"这样的目录
字段7:登录Shell 当前用户登陆后所使用的shell,在centos/rhel系统中,默认的shell是bash;如果不希望用户登陆系统,可以通过usermod 或者手动修改passwd设置,将该字段设置为/sbin/nologin 即可。大多数内置系统账户都是/sbin/nologin,这表示禁止登陆系统。这是出于安全考虑的。
/etc/shadow 文件
由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。其文件权限为----------,即所有用户不可读写执行,其内容为
root:$6$jmM2rFzPCFbmqBkf$oz3AUooR3qaV5uXU67HcXlYiE3hNf0sSsunk1eBTDPrGUOM1xYCyesGoj.ZLTIzdiXEdrnnqNyC5g8SsRnxQm.:16338:0:99999:7:::
bin:*:15615:0:99999:7:::
daemon:*:15615:0:99999:7:::
adm:*:15615:0:99999:7:::
lp:*:15615:0:99999:7:::
- 其中以:为分隔符将每行数据分为9个字段,每个字段含义如下
字段1:帐号名称
字段2:加密的密码
字段3:最近更改密码的时间;从1970/1/1到上次修改密码的天数
字段4:禁止修改密码的天数;从1970/1/1开始,多少天之内不能修改密码,默认值为0
字段5:用户必须更改口令的天数;密码的最长有效天数,默认值为99999
字段6:警告更改密码的期限;密码过期之前警告天数,默认值为7;在用户密码过期前多少天提醒用户更改密码
字段7:不活动时间;密码过期之后账户宽限时间 3+5;在用户密码过期之后到禁用账户的天数
字段8:帐号失效时间,默认值为空;从1970/1/1日起,到用户被禁用的天数
字段9:保留字段(未使用),标志
密码过期:一旦超过密码过期日期,用户成功登陆,Linux会强迫用户设置一个新密码,设置完成后才开启Shell程序
账户过期:若超过账户过期日期,Linux会禁止用户登陆系统,即使输入正确密码,也无法登陆
用户组配置文件
/etc/group #用户组配置文件
/etc/gshadow #用户组的影子文件
/etc/group 文件
其内容格式为
root:x:0:
bin:x:1:bin,daemon
- 每个字段含义如下
字段1:组账户名称
字段2:密码占位符x;通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为'x'。这类似/etc/shadow
字段3:组账户GID号,用户组ID
字段4:本组的成员用户列表;加入这个组的所有用户账号
/etc/gshadow 文件
- 文件内容格式如下
root:::
bin:::bin,daemon
daemon:::bin,daemon
- 每个字段含义如下
字段1:组账号的名称
字段2:加密后的密码字符串,这个字段可以空的或者!;如果是空的或有!,表示没有密码
字段3:本组的管理员列表;这个字段也可为空;如果有多个用户组管理员,用,号分隔
字段4:本组的成员列表;加入这个组的所有用户账户;列表中多个用户通过","分隔
账号管理配置文件
/etc/skel目录
/etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件都会自动被复制到新添加的用户的家目录下;默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以.点开头);通过修改、添加、删除/etc/skel目录下的文件,我们可为新创建的用户提供统一、标准的、初始化用户环境。
/etc/login.defs配置文件
/etc/login.defs文件是用来定义创建用户时需要的一些用户的配置文件。如创建用户时,是否需要家目录,UID和GID的范围,用户及密码的有效期限等等。
- login.defs配置文件主要参数如下
MAIL_DIR /var/spool/mail #创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;
PASS_MAX_DAYS 99999 #一个密码最长可以使用的天数
PASS_MIN_DAYS 0 #更改密码的最小天数
PASS_MIN_LEN 5 #密码的最小长度;
PASS_WARN_AGE 7 #密码失效提前多少天开始警告
UID_MIN 500 #最小UID为500,也就是说添加用户时,UID是从500开始的;
UID_MAX 60000 #最大UID为60000;
GID_MIN 500 #GID依然是从500开始;同上面用户的情况;
GID_MAX 60000
CREATE_HOME yes #是否创建用户家目录,默认要求创建;可用-m参数来控制;
USERGROUPS_ENAB yes #删除用户同时删除用户组
MD5_CRYPT_ENAB yes #MD5密码加密
/etc/default/useradd文件
/etc/default/useradd文件是在使用useradd添加用户时需要调用的一个默认的配置文件,可以使用useradd -D参数,这样的命令格式来修改文件里面的内容,当然也可以直接编辑修改。我们先来看看它的内容
GROUP=100
HOME=/home #把用户的家目录建在/home中
INACTIVE=-1 #是否启动账号过期停权,-1表示不启用
EXPIRE= #账号终止日期,不设置表示不启用
SHELL=/bin/bash #新用户默认所用的shell类型
SKEL=/etc/skel #配置新用户家目录的默认文件存放路径。前文提到的/etc/skell,就是配在这里生效的,即当我们用useradd添加时,用户家目录的文件,都是从这里配置的目录中复制过去的。
CREATE_MAIL_SPOOL=yes #创建mail文件
用户管理
- 添加用户
useradd [-mMnr] [-c <备注>] [-d <登入目录>] [-e <有效期限>] [-f <缓冲天数>] [-g <群组>] [-G <群组>] [-s <shell>] [-u <uid>] [用户帐号]
-c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录> 指定用户登入时的启始目录。
-D 变更预设值.
-e<有效期限> 指定帐号的有效期限。
-f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。
-g<群组> 指定用户所属的群组。
-G<群组> 指定用户所属的附加群组。
-m 自动建立用户的登入目录。
-M 不要自动建立用户的登入目录。
-n 取消建立以用户名称为名的群组.
-r 建立系统帐号。
-s<shell> 指定用户登入后所使用的shell。
-u<uid> 指定用户ID。
示例:
useradd panso -m -s /bin/bash -g TestGroup
- 密码管理
passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]
-c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录> 指定用户登入时的启始目录。
-D 变更预设值.
-e<有效期限> 指定帐号的有效期限。
-f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。
-g<群组> 指定用户所属的群组。
-G<群组> 指定用户所属的附加群组。
-m 自动建立用户的登入目录。
-M 不要自动建立用户的登入目录。
-n 取消建立以用户名称为名的群组.
-r 建立系统帐号。
-s<shell> 指定用户登入后所使用的shell。
-u<uid> 指定用户ID。
示例(修改密码):
passwd panso
- 修改用户信息
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]
-c<备注> 修改用户帐号的备注文字。
-d登入目录> 修改用户登入时的目录。
-e<有效期限> 修改帐号的有效期限。
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-g<群组> 修改用户所属的群组。
-G<群组> 修改用户所属的附加群组。
-l<帐号名称> 修改用户帐号名称。
-L 锁定用户密码,使密码无效。
-s<shell> 修改用户登入后所使用的shell。
-u<uid> 修改用户ID。
-U 解除密码锁定。
示例(添加用户到分组中):
usermod panso -G TestGroup
- 修改用户密码有效期
chage [选项] 用户名
-d:将最近一次密码设置时间设置为"最近时间"
-E:指定账号过期时间,YYYY-MM-DD
-I:指定当密码失效后多少天锁定账号;
-l:列出密码有效期信息
-m:指定密码的最小天数
-M:指定密码的最大天数
-W:将过期警告天数设置为"警告天数"
示例:
chage -m 1 panso
- 删除用户
userdel panso
- 禁止口令登录
vim /etc/ssh/sshd_config
将PasswordAuthentication yes改为PasswordAuthentication no
- 配置秘钥登录
# 生成秘钥,在任意一台服务器上
ssh-keygen -t rsa
# 一路回车,生成完成后
ls ~/.ssh # id_rsa id_rsa.pub
# 在用户目录下创建.ssh文件夹和authorized_keys文件,若是在修改其它用户,则最后需要给.ssh文件赋予该用户权限
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
# 将id_rsa 文件内容复制在该文件内
chmod 600 .ssh/authorized_keys
- 修改其它用户对文件的权限
chown [-cfhvR] [--help] [--version] user[:group] file...
user : 新的文件拥有者的使用者 ID
group : 新的文件拥有者的使用者组(group)
-c : 显示更改的部分的信息
-f : 忽略错误信息
-h :修复符号链接
-v : 显示详细的处理信息
-R : 处理指定目录以及其子目录下的所有文件
--help : 显示辅助说明
--version : 显示版本
示例:
sudo chown -R panso:TestGroup .ssh