📄 用户(user)和用户组(group)配置文件详解 linuxsir_org.htm
字号:
<P>UID是唯一性,只是要求管理员所做的,其实我们修改/etc/passwd 文件,可以修改任何用户的UID的值为0,</P>
<P>一般情况下,每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用,虚拟用户一般是系统安装时就有的,是为了完成系统任务所必须的用户,但虚拟用户是不能登录系统的,比如ftp、nobody、adm、rpm、bin、shutdown等;</P>
<P>在Fedora 系统会把前499 个UID和GID 预留出来,我们添加新用户时的UID
从500开始的,GID也是从500开始,至于其它系统,有的系统可能会把前999UID和GID预留出来;以各个系统中/etc/login.defs中的
UID_MIN 的最小值为准; Fedora 系统 login.defs的UID_MIN是500,而UID_MAX
值为60000,也就是说我们通过adduser默认添加的用户的UID的值是500到60000之间;而Slackware
通过adduser不指定UID来添加用户,默认UID 是从1000开始;</P>
<P><FONT size=3><B><BR>2、关于/etc/shadow ;<BR></B></FONT></P>
<P><FONT size=2><B><BR>1)/etc/shadow 概说;<BR></B></FONT></P>
<P>/etc/shadow文件是/etc/passwd 的影子文件,这个文件并不由/etc/passwd
而产生的,这两个文件是应该是对应互补的;shadow内容包括用户及被加密的密码以及其它/etc/passwd
不能包括的信息,比如用户的有效期限等;这个文件只有root权限可以读取和操作,权限如下:<BR><BR><BR>
<DIV class=codeblock><CODE>-r-------- 1 root root 1.5K 10月 16 09:49
/etc/shadow</CODE></DIV>
<P></P>
<P>/etc/shadow
的权限不能随便改为其它用户可读,这样做是危险的。如果您发现这个文件的权限变成了其它用户组或用户可读了,要进行检查,以防系统安全问题的发生;</P>
<P>如果我们以普通用户查看这个文件时,应该什么也查看不到,提示是权限不够:</P>
<P>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ more
/etc/shadow<BR>/etc/shadow: 权限不够</CODE></DIV>
<P></P>
<P><FONT size=2><B><BR>2)/etc/shadow 的内容分析;<BR></B></FONT></P>
<P>/etc/shadow 文件的内容包括9个段位,每个段位之间用:号分割;我们以如下的例子说明;</P>
<P>
<DIV
class=codeblock><CODE>beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::<BR>linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:</CODE></DIV>
<P></P>
<P><B>第一字段:</B>用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd
和shadow中用的用户记录联系在一起;这个字段是非空的;<BR><B>第二字段:</B>密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;<BR><B>第三字段:</B>上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd
来修改用户的密码,然后查看/etc/shadow中此字段的变化;<BR><B>第四字段:</B>两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,PASS_MIN_DAYS
中有定义;<BR><B>第五字段:</B>两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS
中定义;<BR><B>第六字段:</B>提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE
中定义;<BR><B>第七字段:</B>在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;<BR><B>第八字段:</B>用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;<BR><B>第九字段:</B>保留字段,目前为空,以备将来Linux发展之用;</P>
<P>如果更为详细的,请用 man
shadow来查看帮助,您会得到更为详尽的资料;<BR><B><BR>我们再根据实例分析:<BR></B><BR>
<DIV
class=codeblock><CODE>beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::<BR>linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:</CODE></DIV>
<P></P>
<P><B>第一字段:</B>用户名(也被称之为登录名),在例子中有峡谷两条记录,也表示有两个用户beinan和linuxsir<BR><B>第二字段:</B>被加密的密码,如果有的用户在此字段中是x,表示这个用户不能登录系统,也可以看作是虚拟用户,不过虚拟用户和真实用户都是相对的,系统管理员随时可以对任何用户操作;<BR><B>第三字段:</B>表示上次更改口令的天数(距1970年01月01日),上面的例子能说明beinan和linuxsir这两个用户,是在同一天更改了用户密码,当然是通过passwd
命令来更改的,更改密码的时间距1970年01月01日的天数为13072;<BR><B>第四字段:</B>禁用两次口令修改之间最小天数的功能,设置为0<BR><B>第五字段:</B>两次修改口令间隔最多的天数,在例子中都是99999天;这个值如果在添加用户时没有指定的话,是通过/etc/login.defs来获取默认值,PASS_MAX_DAYS
99999;您可以查看/etc/login.defs来查看,具体的值;<BR><B>第六字段:</B>提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE
中定义;在例子中的值是7
,表示在用户口令将过期的前7天警告用户更改期口令;<BR><B>第七字段:</B>在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;在例子中,此字段两个用户的都是空的,表示禁用这个功能;<BR><B>第八字段:</B>用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;在例子中,我们看到beinan这个用户在此字段是空的,表示此用户永久可用;而linuxsir这个用户表示在距1970年01月01日后13108天后过期,算起来也就是2005年11月21号过期;哈哈,如果有兴趣的的弟兄,自己来算算,大体还是差不多的;);<BR><B>第九字段:</B>保留字段,目前为空,以备将来Linux发展之用;</P>
<P><FONT
size=4><B><BR>二、关于用户组;<BR></B></FONT><BR>具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有
/etc/group和/etc/gshadow,其中/etc/gshadow是/etc/group的加密信息文件;在本标题下,您还能了解到什么是GID
;</P>
<P><FONT size=3><BR>1、/etc/group 解说;<BR></B></FONT></P>
<P>/etc/group
文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的;</P>
<P>用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去,<BR><FONT
size=3><B><BR>2、/etc/group 内容具体分析<BR></B></FONT></P>
<P>/etc/group
的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;格式如下:</P>
<P>
<DIV class=codeblock><CODE>group_name:passwd:GID:user_list</CODE></DIV>
<P></P>
<P>在/etc/group 中的每条记录分四个字段:</P>
<P><B>第一字段:</B>用户组名称;<BR><B>第二字段:</B>用户组密码;<BR><B>第三字段:</B>GID<BR><B>第四字段:</B>用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;</P>
<P>我们举个例子:</P>
<P>
<DIV class=codeblock><CODE>root:x:0:root,linuxsir
注:用户组root,x是密码段,表示没有设置密码,GID是0,root用户组下包括root、linuxsir以及GID为0的其它用户(可以通过/etc/passwd查看);;<BR>beinan:x:500:linuxsir
注:用户组beinan,x是密码段,表示没有设置密码,GID是500,beinan用户组下包括linuxsir用户及GID为500的用户(可以通过/etc/passwd查看);<BR>linuxsir:x:502:linuxsir
注:用户组linuxsir,x是密码段,表示没有设置密码,GID是502,linuxsir用户组下包用户linuxsir及GID为502的用户(可以通过/etc/passwd查看);<BR>helloer:x:503:
注:用户组helloer,x是密码段,表示没有设置密码,GID是503,helloer用户组下包括GID为503的用户,可以通过/etc/passwd查看;</CODE></DIV>
<P></P>
<P>而/etc/passwd 对应的相关的记录为:</P>
<P>
<DIV
class=codeblock><CODE>root:x:0:0:root:/root:/bin/bash<BR>beinan:x:500:500:beinan
sun:/home/beinan:/bin/bash<BR>linuxsir:x:505:502:linuxsir open,linuxsir
office,13898667715:/home/linuxsir:/bin/bash<BR>helloer:x:502:503::/home/helloer:/bin/bash</CODE></DIV>
<P></P>
<P>由此可以看出helloer用户组包括
helloer用户;所以我们查看一个用户组所拥有的用户,可以通过对比/etc/passwd和/etc/group来得到;</P>
<P><FONT size=3><B><BR>2、关于GID ;<BR></B></FONT></P>
<P>GID和UID类似,是一个正整数或0,GID从0开始,GID为0的组让系统付予给root用户组;系统会预留一些较靠前的GID给系统虚拟用户(也被称为伪装用户)之用;每个系统预留的GID都有所不同,比如Fedora
预留了500个,我们添加新用户组时,用户组是从500开始的;而Slackware
是把前100个GID预留,新添加的用户组是从100开始;查看系统添加用户组默认的GID范围应该查看 /etc/login.defs 中的
GID_MIN 和GID_MAX 值;</P>
<P>我们可以对照/etc/passwd和/etc/group 两个文件;我们会发现有默认用户组之说;我们在 /etc/passwd
中的每条用户记录会发现用户默认的GID
;在/etc/group中,我们也会发现每个用户组下有多少个用户;在创建目录和文件时,会使用默认的用户组;我们还是举个例子;</P>
<P>比如我把linuxsir 加为root用户组,在/etc/passwd 和/etc/group
中的记录相关记录为:<BR>linuxsir用户在 /etc/passwd
中的记录;我们在这条记录中看到,linuxsir用户默认的GID为502;而502的GID
在/etc/group中查到是linuxsir用户组;</P>
<P>
<DIV class=codeblock><CODE>linuxsir:x:505:502:linuxsir open,linuxsir
office,13898667715:/home/linuxsir:/bin/bash</CODE></DIV>
<P></P>
<P>linuxsir 用户在 /etc/group 中的相关记录;在这里,我们看到linuxsir用户组的GID 为502,而linuxsir
用户归属为root、beinan用户组;</P>
<P>
<DIV
class=codeblock><CODE>root:x:0:root,linuxsir<BR>beinan:x:500:linuxsir<BR>linuxsir:x:502:linuxsir</CODE></DIV>
<P></P>
<P>我们用linuxsir 来创建一个目录,以观察linuxsir用户创建目录的权限归属;</P>
<P>
<DIV class=codeblock><CODE>[linuxsir@localhost ~]$ mkdir
testdir<BR>[linuxsir@localhost ~]$ ls -lh<BR>总用量 4.0K<BR>drwxrwxr-x 2
linuxsir linuxsir 4.0K 10月 17 11:42 testdir</CODE></DIV>
<P></P>
<P>通过我们用linuxsir
来创建目录时发现,testdir的权限归属仍然是linuxsir用户和linuxsir用户组的;而没有归属root和beinan用户组,明白了吧;</P>
<P>但值得注意的是,判断用户的访问权限时,默认的GID
并不是最重要的,只要一个目录让同组用户可以访问的权限,那么同组用户就可以拥有该目录的访问权,在这时用户的默认GID 并不是最重要的;</P>
<P><FONT size=3><B><BR>3、/etc/gshadow 解说;<BR></B></FONT></P>
<P>/etc/gshadow是/etc/group的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码;</P>
<P>/etc/gshadow 格式如下,每个用户组独占一行;<BR>
<DIV
class=codeblock><CODE>groupname:password:admin,admin,...:member,member,...</CODE></DIV>
<P></P>
<P><B>第一字段:</B>用户组<BR><B>第二字段:</B>用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码;<BR><B>第三字段:</B>用户组管理者,这个字段也可为空,如果有多个用户组管理者,用,号分割;<BR><B>第四字段:</B>组成员,如果有多个成员,用,号分割;</P>
<P>举例:</P>
<P>
<DIV
class=codeblock><CODE>beinan:!::linuxsir<BR>linuxsir:oUS/q7NH75RhQ::linuxsir</CODE></DIV>
<P></P>
<P>第一字段:这个例子中,有两个用户组beinan用linuxsir<BR>第二字段:用户组的密码,beinan用户组无密码;linuxsir用户组有已经,已经加密;<BR>第三字段:用户组管理者,两者都为空;<BR>第四字段:beinan用户组所拥有的成员是linuxsir
,然后还要对照一下/etc/group和/etc/passwd 查看是否还有其它用户,一般默认添加的用户,有时同时也会创建用户组和用户名同名称;
linuxsir 用户组有成员linuxisir ;</P>
<P>如何设置用户组的密码? 我们可以通过 gpasswd
来实现;不过一般的情况下,没有必要设置用户组的密码;不过自己实践一下也有必要;下面是一个为linuxsir用户组设置密码的例子;</P>
<P><CODE>gpasswd 的用法:</CODE> gpasswd 用户组</P>
<P>
<DIV class=codeblock><CODE>root@localhost ~]# gpasswd linuxsir<BR>正在修改
linuxsir 组的密码<BR>新密码:<BR>请重新输入新密码:</CODE></DIV>
<P></P>
<P>用户组之间的切换,应该用 newgrp ,这个有点象用户之间切换的su ;我先举个例子:<BR>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ newgrp
linuxsir<BR>密码:<BR>[beinan@localhost ~]$ mkdir
lingroup<BR>[beinan@localhost ~]$ ls -ld lingroup/<BR>drwxr-xr-x 2 beinan
linuxsir 4096 10月 18 15:56 lingroup/<BR>[beinan@localhost ~]$ newgrp
beinan<BR>[beinan@localhost ~]$ mkdir beinangrouptest<BR>[beinan@localhost
~]$ ls -ld beinangrouptest<BR>drwxrwxr-x 2 beinan beinan 4096 10月 18 15:56
beinangrouptest</CODE></DIV>
<P></P>
<P>说明:我是以beinan用户组切换到linuxsir用户组,并且建了一个目录,然后再切换回beinan用户组,又建了一个目录,请观察两个目录属用户组的不同;还是自己体会吧;</P>
<P><FONT size=4><B><BR>三、通过用户和用户组配置文件来查询或管理用户;<BR></B></FONT></P>
<P><FONT size=3><B><BR>1、用户和用户组查询的方法;<BR></B></FONT><BR><FONT
size=2><B><BR>1)通过查看用户(User)和用户组的配置文件的办法来查看用户信息<BR></B></FONT></P>
<P>我们已经用户(User)和用户组(Group)的配置文件已经有个基本的了解,通过查看用户(User)和用户组的配置文件,我们就能做到对系统用户的了解,当然您也可以通过id
或finger 等工具来进行用户的查询等任务。</P>
<P>对于文件的查看,我们可以通过 more 或cat 来查看,比如 more /etc/passwd 或cat /etc/passwd
;其它工具也一样,能对文本查看就行,比如less 也好</P>
<P>比如我们可以通过more 、cat 、less命令对/etc/passwd 的查看,虽然命令不同,但达到的目的是一样的,
都是得到/etc/passwd 的内容;</P>
<P>
<DIV class=codeblock><CODE>[root@localhost ~]# more
/etc/passwd<BR>[root@localhost ~]# cat /etc/passwd<BR>[root@localhost ~]#
less /etc/passwd</CODE></DIV><BR><FONT size=2><BR>2)通过id和finger
工具来获取用户信息;<BR></B></FONT>
<P></P>
<P>除了直接查看用户(User)和用户组(Group)配置文件的办法除外,我们还有id和finger工具可用,我们一样通过命令行的操作,来完成对用户的查询;id和finger,是两个各有测重的工具,id工具更测重用户、用户所归属的用户组、UID
和GID 的查看;而finger 测重用户资讯的查询,比如用户名(登录名)、电话、家目录、登录SHELL类型、真实姓名、空闲时间等等;</P>
<P><B><BR>id 命令用法;<BR></B><BR>
<DIV class=codeblock><CODE>id 选项 用户名</CODE></DIV>
<P></P>
<P>比如:我想查询beinan和linuxsir 用户的UID、GID 以及归属用户组的情况:<BR>
<DIV class=codeblock><CODE>[root@localhost ~]# id
beinan<BR>uid=500(beinan) gid=500(beinan)
groups=500(beinan)<BR>注:beinan的UID 是 500,默认用户组是beinan,默认用户组的GID
是500,归属于beinan用户组;<BR>[root@localhost ~]# id linuxsir<BR>uid=505(linuxsir)
gid=502(linuxsir)
groups=502(linuxsir),0(root),500(beinan)<BR>注:linuxsir的UID
是505,默认用户组是linuxsir ,默认用户组的GID
是502,归属于linuxsir(GID为502)、root(GID为0),beinan(GID为500);</CODE></DIV>
<P></P>
<P>关于id的详细用法,我会在专门用户查询的文章来介绍;您可以通过man id 来查看用法,用起来还是比较简单的;</P>
<P><B>finger 的用法</B><BR>
<DIV class=codeblock><CODE>finger 选项 用户名1 用户名2 ...</CODE></DIV>
<P></P>
<P>详细用法请参看man finger ;关于更为详细用法,我会在专门用户查询的文章来介绍;</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -