LINUX系统中的用户和用户组管理(一)【转】

本文转载于https://www.cnblogs.com/zhongguiyao/p/9165917.html

一、用户账户管理

Linux/Unix是一个用户、多任务的操作系统;在讲Linux账号及账户组管理之前,先简单了解一下多用户、多任务操作系统的基本概念。

 Linux的单用户多任务

在Linux下,当你登录后,你也可以同时开启很多的服务任务和进程,而各自服务都会跑的很好却对其他任务没有任何影响,这种登录一个用户登录系统执行多个服务任务和进程的情况,就称为单用户多任务。

Linux的多用户多任务

有时可能是很多用户同时用同一个系统,如公司几十个运维人员,每台机器都可以和被若干个运维人员登录部署或解决相关故障问题,但并不是所有的运维人员都要做同一件事,所以就有了多任务、多用户的情况。

值得注意的是:多用户、多任务并不是大家同时挤到一起,在一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程工具等远程登录服务器来进行,比如对服务器的运程控制,只要具有相关用户的权限,任何人都是可以上去操作访问服务器。

linux系统用户角色划分

用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和GID识别的;特别是UID,在运维工作中,一个UID是唯一标识一个系统用户的账号。

用户账户:



超级用户root(0)
程序用户(1~499)
普通用户(500~65535)

超级用户:
默认是root用户,其UID和GID均为0。在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,
拥有最高的管理权限。在生产环境,一般禁止root账号远程登录SSH连接服务器,以加强系统安全。

普通用户:
这类用户一般是由具备系统管理员root的权限的运维人员添加的。

程序用户:
与真实用户区分开来,这类用户的最大特点是安装系统后默认就会存在的,且默认情况不能登录系统,它们是系统正常运行必不可少的,
他们的存在主要是方便系统管理,满足相应的系统进程都文件属主的要求。例如系统默认的bin、adm、nodoby、mail用户等。由于服务器角色的不同,
有部分用不到的系统服务被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)。

多用户操作系统的安全

多用户系统从实际来说使得系统管理更为方便了。从安全角度来说,多用户也更为安全,比如普通用户zgy下的某个文件不想让其他用户看到,只是设置一下该文件的权限为普通用户zgy一个用户可读可写可执行的权限就行了,这样以来只有普通用户zgy一个用户可以对其私有文件进行操作,从而达到了保护每个用户的私有数据安全。

二、账户(user)和账户组(group)

用户(user)介绍:

如果要使用系统资源,就必须向系统管理员申请一个账号,然后通过这个账号进入系统。这个账号和用户是同一个账号,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。

每一个用户都有一个唯一的用户名和用户口令,在登录系统后,只有正确输入了用户名和密码,才能登录系统和相应的目录。
在生产环境中,一般会为每一个有权限管理服务器的运维人员分配一个独立的普通用户账号及8位以上(包含数字、字母)以上的密码。

如zgy普通用户,该人员只能通过建立的这个账号登录到系统中进行维护,当需要超级用户权限时,可以通过"sudo 命令名"方式来执行仅有root权限才允许执行的权限。当然,sudo权限要尽量的小。还有,当运维人数不多时(如2-3个),也可以直接su - 切换到超级用户root下,再执行相应的维护工作。特别提醒,维护时,如果不需要root权限,就不要进入root用户下操作,以减少误操作对系统带来的损失。

用户组(group)介绍:

简单的说,linux系统中的用户组(group)就是具有相同特性的用户(user)集合;
有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件或目录,如果不用用户组,这种需求在授权时就很难实现。如果使用用户组就方便多了,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。
将用户分组是linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。
实际上,在日常生活中,对人类的分组也是无处不在的,达到国家,小到公司,家庭,学校,班级等等都类似linux中用户组的概念,而其中的成员就类似linux用户组中用户的概念。

用户和用户组的对应关系

用户和用户组的对应关系有:一对一、一对多、多对一和多对多.
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。比如,root。
一对多:即一个用户可以存在多个组中,这个用户就具有这些组的权限。
多对一:即多个用户可以存在一个组中,这些用户拥有这个组的共同权限。
多对多:即多用户可以存在于多个组中。并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展。

组账户:
基本组(私有组)
附加组(公共组)

用户及用户组配置文件介绍

Linux系统中下的账户文件主要有/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow四个文件。

用户的配置文件/etc/passwd

/etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,
各内容之间又通过”:”号划分了7个字段,这7个字段分别定义了账号的不同属性,passwd文件实际内容如下:

[root@Web ~]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


在passwd文件中,第一行内容就是超级用户root行,可以看到它的uid和gid都为0.为了方便理解,下面是各字段的描述:

字段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,        
             这表示禁止登陆系统。这是出于安全考虑的。
             
passwd中有关UID的限制说明
0:当用户的UID为0时,表示这个账户为超级用户;如果要增加一个系统管理员账户的话,只需将该账户的UID改为0即可。不建议
1~499:这个范围是保留给系统用户使用的UID
500~65535:普通账户UID

最后,来看一下/etc/passwd的权限:
[root@Web ~]# ls -l /etc/passwd
-rw-r--r--. 1 root root 1665 4月  11 14:13 /etc/passwd
 
因为每个用户登录时都需要取得UID和GID来判断权限问题,所以/etc/passwd的权限为644,这样一来就会带来安全问题,即所有的用户都可以都/etc/passwd文件,即使文件内的密码是加密的,但还是存在一定的被攻击破解的安全隐患。因此,就有了/etc/shadow文件。

用户的影子口令文件/etc/shadow

由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。

来看一下/etc/shadow的权限:

 

[root@Web ~]# ls -l /etc/shadow
----------. 1 root root 1059 4月  11 14:13 /etc/shadow
 

其文件内容为:

[root@Web ~]# head -5 /etc/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:::

和/etc/passwd一样,shadow文件的每一行内容,也是以冒号(:)作为分隔符,共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/group 文件是用户组的配置文件,内容包括用户与用户组,并且能显示用户归属哪个用户组,因为一个用户可以
 归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特性。如果某个用户下有对系统管理有最重要的内
 容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进入。

 /etc/group文件就是记录GID与用户组的文件。/etc/group文件同/etc/passwd类似,其文件权限也是644:
 
[root@Web ~]# ls -l /etc/group
-rw-r--r--. 1 root root 832 4月  11 14:13 /etc/group
 
/etc/group的文件内容为:

[root@Web ~]# head -5 /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
 
group文件各个字段的详细说明:

   字段1:组账户名称
    字段2:密码占位符x;通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为'x'。这类似/etc/shadow
    字段3:组账户GID号,用户组ID
    字段4:本组的成员用户列表;加入这个组的所有用户账号

用户组的影子文件/etc/gshadow

/etc/gshaow是/etc/group的加密文件,比如用户组的管理密码就是存放在这个文件。
/etc/group和/etc/gshadow是互补的两个文件;比如大型服务器,针对很多用户和用户组,
 定制一些关系结构比较复杂的额权限模型,设置用户组密码是极有必要的。比如不想让一
 些非用户组成员永久拥有用户组的权限和特性,这时就可以通过密码验证的方式来让某些
 用户临时拥有一些用户组特性,这时就要用到用户组密码;/etc/gshadow格式如下,每个用户组独占一行;


[root@Web ~]# ls -l /etc/gshadow
----------. 1 root root 682 4月  11 14:13 /etc/gshadow
[root@Web ~]# head -5 /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon

gshadow文件中各个字段详细说明:


字段1:组账号的名称
字段2:加密后的密码字符串,这个字段可以空的或者!;如果是空的或有!,表示没有密码
字段3:本组的管理员列表;这个字段也可为空;如果有多个用户组管理员,用,号分隔
字段4:本组的成员列表;加入这个组的所有用户账户;列表中多个用户通过","分隔

账号管理

与账户相关的文件和目录
/etc/default/useradd
/etc/login.defs
/etc/skel/

/etc/skel目录

     /etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件都
     会自动被复制到新添加的用户的家目录下;默认情况下,/etc/skel目录下的所有文件都是隐藏文件
     (以.点开头);通过修改、添加、删除/etc/skel目录下的文件,我们可为新创建的用户提供统一、标准的、初始化用户环境。

下面我们就看下/etc/skel目录的内容:
[root@localhost ~]# ls -al /etc/skel/
total 64
drwxr-xr-x  3 root root  4096 Apr 30 17:20 .
drwxr-xr-x 91 root root 12288 May  2 10:01 ..
-rw-r--r--  1 root root    33 May 13  2011 .bash_logout
-rw-r--r--  1 root root   176 May 13  2011 .bash_profile
-rw-r--r--  1 root root   124 May 13  2011 .bashrc
-rw-r--r--  1 root root   515 Apr  7  2011 .emacs
drwxr-xr-x  4 root root  4096 Apr 30 17:20 .mozilla

当我们用useradd 或adduser命令添加新用户时,linux系统会自动复制/etc/skel下的所有文件(包括隐藏文件)到新添加用户的家目录

/etc/login.defs配置文件

/etc/login.defs文件是用来定义创建用户时需要的一些用户的配置文件。如创建用户时,是否需要家目录,UID和GID的范围,用户及密码的有效期限等等。

下面是RHEL 5的/etc/login.defs文件内容


[root@localhost ~]# cat /etc/login.defs 
# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail  #创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;
#MAIL_FILE      .mail

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999   #一个密码最长可以使用的天数
PASS_MIN_DAYS   0    #更改密码的最小天数
PASS_MIN_LEN    5    #密码的最小长度;
PASS_WARN_AGE   7    #密码失效提前多少天开始警告

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                   500   #最小UID为500,也就是说添加用户时,UID是从500开始的;
UID_MAX                 60000   #最大UID为60000;

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                   500   #GID依然是从500开始;同上面用户的情况;
GID_MAX                 60000

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes   #是否创建用户家目录,默认要求创建;可用-m参数来控制;

# The permission mask is initialized to this value. If not specified, 
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes     #删除用户同时删除用户组

# Use MD5 or DES to encrypt password? Red Hat use MD5 by default.
MD5_CRYPT_ENAB yes     #MD5密码加密

/etc/default/useradd文件

/etc/default/useradd文件是在使用useradd添加用户时需要调用的一个默认的配置文件,可以使用useradd -D参数,
这样的命令格式来修改文件里面的内容,当然也可以直接编辑修改。
我们先来看看它的内容
[root@localhost ~]
#  cat   /etc/default/useradd 

# useradd defaults file
GROUP=100
HOME=/home   #把用户的家目录建在/home中
INACTIVE=-1  #是否启动账号过期停权,-1表示不启用
EXPIRE=   #账号终止日期,不设置表示不启用
SHELL=/bin/bash   #新用户默认所用的shell类型
SKEL=/etc/skel  #配置新用户家目录的默认文件存放路径。前文提到的/etc/skell, 就是配在这里生效的,
                 即当我们用useradd添加时,用户家目录的文件,都是从这里 配置的目录中复制过去的。
CREATE_MAIL_SPOOL=yes  #创建mail文件



实例2:
[root@localhost ~]# mkdir /ett
[root@localhost ~]# cp -a /etc/skel/* /ett/   #把skel目录下的文件复制到/ett下
[root@localhost ~]# ls -al /ett/
total 24
drwxr-xr-x  2 root root 4096 May  2 22:52 .
drwxr-xr-x 26 root root 4096 May  2 22:52 ..
-rw-r--r--  1 root root    7 May  2 22:24 oldboy
[root@localhost ~]# mkdir /ett/test   #创建一个测试目录test
[root@localhost ~]# ls -al /ett/
total 32
drwxr-xr-x  3 root root 4096 May  2 22:52 .
drwxr-xr-x 26 root root 4096 May  2 22:52 ..
-rw-r--r--  1 root root    7 May  2 22:24 oldboy
drwxr-xr-x  2 root root 4096 May  2 22:52 test
[root@localhost ~]#sed -i 's#SKEL=/etc/skel#SKEL=/ett#g' /etc/default/useradd    #修改SKEL的默认路径
[root@localhost ~]# grep ett /etc/default/useradd 
SKEL=/ett
[root@localhost ~]# useradd old  #添加用户old测试
[root@localhost ~]# ll /home/old -al
total 32
drwx------ 3 old  old  4096 May  2 22:56 .
drwxr-xr-x 6 root root 4096 May  2 22:56 ..
-rw-r--r-- 1 old  old     7 May  2 22:56 oldboy   #发现/ett下的目录和文件都拷贝过来了
drwxr-xr-x 2 old  old  4096 May  2 22:56 test
[root@localhost ~]# sed -i 's#SKEL=/ett#SKEL=/etc/skel#g' /etc/default/useradd   #测试完后还原配置
[root@localhost ~]# grep etc /etc/default/useradd 
SKEL=/etc/skel
特别提醒:上面的例子是更改/etc/default/useradd中SKEL路径后测试的例子。其他参数的修改方法

你可能感兴趣的:(LINUX系统中的用户和用户组管理(一)【转】)