zoukankan      html  css  js  c++  java
  • Linux用户管理.md

    用户与组的概念

    linux多用户,多任务的特性

    Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响,例如某台linux服务器上有4个用户,分别是root、www、ftp和mysql,在同一时间内,root用户可能在查看系统日志,管理维护系统,www用户可能在修改自己的网页程序,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL查询,每个用户互不干扰,有条不紊的进行着自己的工作,而每个用户之间不能越权访问,比如www用户不能执行mysql用户的SQL查询操作,ftp用户也不能修改www用户的网页程序,因此可知,不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。

    linux下用户的角色分类

    • 超级用户:拥有对系统的最高管理权限,默认是root用户。

    • 普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如上面提到的www用户、ftp用户等。

    • 虚拟用户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。

    用户和组的概念

    Linux是一个多用户多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是一个概念,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
    每个用户都用一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能进入系统和自己的主目录。
    用户组是具有相同特征用户的逻辑集合,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组,将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。

    用户和组的关系

    用户和用户组的对应关系有:一对一、一对多、多对一和多对多;下图展示了这种关系:


    • 一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。

    • 一对多:即一个用户可以存在多个用户组中。那么此用户具有多个组的共同权限。

    • 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。

    • 多对多:多个用户可以存在多个组中。其实就是上面三个对应关系的扩展。

    用户和组相关的配置文件

    /etc/passwd

    系统用户配置文件,是用户管理中最重要的一个文件。这个文件记录了Linux系统中每个用户的一些基本属性,并且对所有用户可读。/etc/passwd中每一行记录对应一个用户,每行记录又被冒号分割:

    root:x:0:0:root:/root:/bin/bash
    

    其格式和具体含义如下:

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:默认shell

    下面是每个字段的详细含义:

    • 用户名:是代表用户账号的字符串。

    • 口令:存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 版本都使用了shadow技术,把真正加密后的用户口令存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如用“x”或者“*”来表示。

    • 用户标识号:就是用户的UID,每个用户都有一个UID,并且是唯一的,通常UID号的取值范围是0~65535,0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。而在Linux系统中,普通用户UID默认从500开始。UID是linux下确认用户权限的标志,用户的角色和权限都是通过UID来实现的,因此多个用户公用一个UID是非常危险的,会造成系统权限和管理的混乱,例如将普通用户的UID设置为0后,这个普通用户就具有了root用户的权限,这是极度危险的操作。因此要尽量保持用户UID的唯一性。

    • 组标识号:就是组的GID,与用户的UID类似,这个字段记录了用户所属的用户组。它对应着/etc/group文件中的一条记录。

    • 注释性描述:字段是对用户的描述信息,比如用户的住址、电话、姓名等等。

    • 主目录:也就是用户登录到系统之后默认所处的目录,也可以叫做用户的主目录、家目录、根目录等等。

    • 默认shell:就是用户登录系统后默认使用的命令解释器,shell是用户和linux内核之间的接口,用户所作的任何操作,都是通过shell传递给系统内核的。linux下常用的shell有sh、bash、csh等,管理员可以根据用户的习惯,为每个用户设置不同的shell。

    /etc/shadow

    用户影子文件,由于/etc/passwd文件是所有用户都可读的,这样就导致了用户的密码容易出现泄露,因此,linux将用户的密码信息从/etc/passwd中分离出来,单独的放到了一个文件中,这个文件就是/etc/shadow,该文件只有root用户拥有读权限,从而保证了用户密码的安全性。文件内容如下:

    root:$6$emgTqM1yDRLpi3ll$ZggDBxugFnv5KpB/V6/Kii.mX9pD.TRb6QYOtMifuw.SE0fQ2YUFsMJzKZTlZDEKp3okwCTKETsSIXl7hilf0.::0:99999:7:::
    

    文件内容的格式:

    用户名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段

    每个字段的详细含义:

    • 用户名:与/etc/passwd文件中的用户名有相同的含义。

    • 加密口令:存放的是加密后的用户口令字串,如果此字段是“*”、“!”、“x”等字符,则对应的用户不能登录系统。

    • 最后一次修改时间:表示从某个时间起,到用户最近一次修改口令的间隔天数。可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化。

    • 最小时间间隔:表示两次修改密码之间的最小时间间隔。

    • 最大时间间隔:表示两次修改密码之间的最大时间间隔,这个设置能增强管理员管理用户的时效性。

    • 警告时间:表示从系统开始警告用户到密码正式失效之间的天数。

    • 不活动时间:此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统不再让此用户登录,也不会提示用户过期,是完全禁用。

    • 失效时间:表示该用户的帐号生存期,超过这个设定时间,帐号失效,用户就无法登录系统了。如果这个字段的值为空,帐号永久可用。

    • 保留字段:linux的保留字段,目前为空,以备linux日后发展之用。

    /etc/group

    用户组配置文件,用户组的所有信息都存放在此文件中,文件内容如下:

    root:x:0:
    

    文件内容的格式:

    组名:口令:组标识号:组内用户列表

    每个字段的含义:

    • 组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的用户名一样,组名不能重复。

    • 口令:存放的是用户组加密后的口令字串,密码默认设置在/etc/gshadow文件中,而在这里用“x”代替,linux系统下默认的用户组都没有口令,可以通过gpasswd来给用户组添加密码。

    • 组标识号:就是GID,与/etc/passwd中的组标识号对应。

    • 组内用户列表: 显示属于这个组的所有用户,多个用户之间用逗号分隔。

    /etc/login.defs

    用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。下面是CentOS 6系统的信息:

    # egrep -v "^$|^#" /etc/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从500开始。
    GID_MAX            60000
    指定最大GID为60000
    CREATE_HOME    yes
    此项是指定是否创建用户主目录,yes为创建,no为不创建。
    UMASK           077
    权限掩码初始化为此值。 如果未指定,则权限掩码将初始化为022。
    USERGROUPS_ENAB yes
    这使得userdel可以删除用户组(如果没有成员)。
    ENCRYPT_METHOD SHA512 
    使用SHA512加密密码。
    

    下面是CentOS 7 系统的信息:

    # egrep -v "^$|^#" /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                  1000
    UID_MAX                 60000
    SYS_UID_MIN               201
    SYS_UID_MAX               999
    GID_MIN                  1000
    GID_MAX                 60000
    SYS_GID_MIN               201
    SYS_GID_MAX               999
    CREATE_HOME yes
    UMASK           077
    USERGROUPS_ENAB yes
    ENCRYPT_METHOD SHA512
    

    通过CentOS 6 和CentOS 7的配置文件我们可以看到两者的差别:

    • CentOS 6 中系统的用户UID和GID是从 500开始,而CentOS 7 是从1000开始。

    • CentOS 7 中增加了系统用户的ID最小值和最大值以及系统组的ID的最大值和最小值。

    /etc/default/useradd

    当我们通过useradd命令不加任何参数创建一个用户后,用户默认的主目录一般位于/home下,默认使用的shell是/bin/bash,这是为什么呢,看看/etc/default/useradd这个文件的内容就完全明白了。

    # cat /etc/default/useradd
    # useradd defaults file
    GROUP=100
    HOME=/home
    此项表示将新建用户的主目录放在/home目录下
    INACTIVE=-1
    此项表示是否启用帐号过期禁用,-1表示不启用
    EXPIRE=
    此项表示帐号过期日期,不设置表示不启用
    SHELL=/bin/bash
    此项指定了新建用户的默认shell类型
    SKEL=/etc/skel
    此项用来指定用户主目录默认文件的来源,也就是说新建用户主目录下的文件都是从这个目录下复制而来的
    CREATE_MAIL_SPOOL=yes
    是否创建用户的邮件收件箱
    

    /etc/default/useradd文件定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值。改变此文件有两种方法,一种是通过文本编辑器方式更改,另一种是通过useradd命令来更改。这里介绍一下第二种方法:
    Useradd命令加“-D”参数后,就可以修改配置文件/etc/default/useradd,useradd –D不加任何参数时,显示/etc/default/useradd文件的当前设置,使用的一般格式为:

    useradd -D [-g group] [-b base] [-s shell] [-f inactive] [-e expire ]
    

    每个选项详细含义如下:

    • -g default_group :表示新建用户的起始组名或者GID,组名必须为已经存在的用户组名称,GID也必须是已经存在的用户组GID。与/etc/default/useradd文件中“GROUP”行对应。

    • -b default_home :指定新建用户主目录的上级目录,也就是所有新建用户都会在此目录下创建自己的主目录。与/etc/default/useradd文件中HOME行对应。

    • -s default_shell :指定新建用户默认使用的shell,与/etc/default/useradd文件中“SHELL”行对应。

    • -f default_inactive :指定用户帐号过期多长时间后就永久停用,与/etc/default/useradd文件中“INACTIVE”行对应。

    • -e default_expire_date :指定用户帐号的过期时间。与/etc/default/useradd文件中“EXPIRE”行对应。

    /etc/skel

    在创建一个新用户后,会在新用户的主目录下看到类似.bash_profile, .bashrc, .bash_logout等文件,这些文件是怎么来的呢,如果我想让新建立的用户在主目录下默认拥有自己指定的配置文件,该如何设置呢? /etc/skel目录就是解决这个问题的,/etc/skel目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。

    # ls -lah  /etc/skel/
    总用量 28K
    drwxr-xr-x.  4 root root 4.0K 3月  13 14:25 .
    drwxr-xr-x. 79 root root 4.0K 4月   5 22:39 ..
    -rw-r--r--.  1 root root   18 10月 16 2014 .bash_logout
    -rw-r--r--.  1 root root  176 10月 16 2014 .bash_profile
    -rw-r--r--.  1 root root  124 10月 16 2014 .bashrc
    

    用户与组的相关命令

    useradd

    用户账号的管理工作主要涉及到用户账号的添加、修改和删除。 添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。下面就添加用户命令useradd的使用。

    语法

    useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]
    useradd -D [-b][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>]
    

    参数

    • -c:加上备注文字,备注文字保存在passwd的备注栏中。 

    • -d:指定用户登入时的启始目录。

    • -D:变更预设值。

    • -e:指定账号的有效期限,缺省表示永久有效。

    • -f:指定在密码过期后多少天即关闭该账号。

    • -g:指定用户所属的群组。

    • -G:指定用户所属的附加群组。

    • -m:自动建立用户的登入目录。

    • -M:不要自动建立用户的登入目录。

    • -n:取消建立以用户名称为名的群组。

    • -r:建立系统账号。

    • -s:指定用户登入后所使用的shell。

    • -u:指定用户ID号。

    usermod

    usermod命令可用来修改用户帐号的各项设定。

    语法

    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  解除密码锁定。

    userdel

    userdel 是一个底层用于删除用户的工具。userdel 会查询系统账户文件,例如 /etc/password 和 /etc/group。那么它会删除所有和用户名相关的条目。在我们删除它之前,用户名必须存在。由于 userdel 会修改系统账户文件,那么我们需要root特权来运行它。不然我们会遇到一个报错信息“只有root权限才能执行这项操作”或者类似的信息。在我们得到特权后,我们可以通过输入 userdel 从你的控制台删除用户。

    参数

    • -r  删除用户登入目录以及目录中所有文件。

    • -f 强制删除用户

    说明:在用userdel删除用户的时候不带选项只会删除用户,而用户的家目录并不会删除,若想删除就用-r选项,但是这么操作很危险,容易产生误删除,而删除用户在还原时会有点麻烦,在这建议要是今后那个用户还有可能使用就在/etc/passwd文件中把此用户的开头给注释掉,今后在想使用就可以取消注释就行了。

    passwd

    passwd 命令普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被root用户锁定;如果root用户运行passwd ,可以设置或修改任何用户的密码;

    参数

    • -k, --keep-tokens :保持身份验证令牌不过期

    • -d, --delete:删除已命名帐号的密码(只有根用户才能进行此操作)

    • -l, --lock:锁住用户无权更改其密码,仅能通过root权限操作;

    • -u, --unlock :解除锁定;

    • -f, --force:强制操作;

    • -x, --maximum=DAYS :密码的最长有效时限(只有根用户才能进行此操作)

    • -n, --minimum=DAYS:密码的最短有效时限(只有根用户才能进行此操作)

    • -w, --warning=DAYS :在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)

    • -i, --inactive=DAYS :当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)

    • -S, --status:报告已命名帐号的密码状态(只有根用户才能进行此操作)

    • --stdin:从标准输入读取令牌(只有根用户才能进行此操作)

    说明:passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码;如果是普通用户执行passwd 只能修改自己的密码; 如果新建用户后,要为新用户创建密码,则用 passwd 用户名 ,注意要以root用户的权限才能创建;而上面这种创建和修改密码都是交互试的,而我们要是写脚本就不是很合适了下面就用echo命令加上管道来一条命令搞定密码的修改创建,但是这种创建很容易会让人看到密码所以还是谨慎使用。

    # echo password | passwd --stdin root
    # echo -e "password
    password" |passwd root
    

    groupadd

    groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。

    参数

    • -g gid:指定组ID号。

    • -o:允许组ID号,不必惟一。

    • -r:创建系统工作组,系统工作组的组ID小于500;

    • -f:加入已经有的组时,发展程序退出。

    • -K:覆盖配置文件“/ect/login.defs”;

    groupmod

    groupmod命令用于更改群组识别码或名称。 需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。

    参数

    • -g <群组识别码>  设置欲使用的群组识别码。

    • -o  重复使用群组识别码。

    • -n <新群组名称>  设置欲使用的群组名称。

    groupdel

    groupdel命令用于删除指定的工作组,此命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。 如果有任何一个群组的使用者在线上的话就不能移除该群组。最好先移除使用者后再移除群组。

    gpasswd

    gpasswd命令用于管理/ etc / group和/ etc / gshadow。 每个组都可以有管理员,成员和密码。

    参数

    除了 -A 和 -M 选项,其它选项不能联合使用。

    • -a, --add USER 向组 GROUP 中添加用户 USER

    • -d, --delete USER 从组 GROUP 中添加或删除用户

    • -h, --help 显示此帮助信息并推出

    • -Q, --root CHROOT_DIR 要 chroot 进的目录

    • -r, --delete-password remove the GROUP's password

    • -R, --restrict 向其成员限制访问组 GROUP

    • -M, --members USER,... 设置组 GROUP 的成员列表

    • -A, --administrators ADMIN,... 设置组的管理员列表

    如何使用:
    如系统有个peter账户,该账户本身不是groupname群组的成员,使用newgrp需要输入密码即可 让使用者暂时加入成为该组成员,之后peter建立的文件group也会是groupname。所以该方式可以暂时让peter建立文件时使用其他的组,而不是peter本身所在的组。 所以使用gpasswd groupname设定密码,就是让知道该群组密码的人可以暂时切换具备groupname群组功能的。

    gpasswd -A peter users  
    gpasswd -a mary users
    gpasswd -a allen users
    

    给组账号设置完密码以后,用户登陆系统,使用newgrp命令,输入给组账号设置的密码,就可以临时添加到指定组,可以管理组用户,具有组权限。

    newgrp

    newgrp命令用于登入另一个群组。 newgrp指令类似login指令,当它是以相同的帐号,另一个群组名称,再次登入系统。欲使用newgrp指令切换群组,您必须是该群组的用户,否则将无法登入指定的群组。实际使用中单一用户要同时隶属多个群组,需利用交替用户的设置。若不指定群组名称,则newgrp指令会登入该用户名称的预设群组。若切换到其他用户组来执行一些操作,就用到newgrp命令切换当前登录所在组。

    chage

    chage命令更改密码更改与最后一次密码更改日期之间的天数。 该信息由系统使用以确定用户何时必须更改其密码。

    参数

    • -d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”

    • -E, --expiredate 过期日期 将帐户过期时间设为“过期日期”

    • -h, --help 显示此帮助信息并推出

    • -I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态

    • -l, --list 显示帐户年龄信息

    • -m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”

    • -M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”

    • -R, --root CHROOT_DIR chroot 到的目录

    • -W, --warndays 警告天数 将过期警告天数设为“警告天数”

    id

    id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。 当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在/etc/group文件中搜寻。

    参数

    -Z, --context        仅显示当前用户的安全环境
    -g, --group        仅显示有效的用户组ID
    -G, --groups        显示所有组的ID
    -n, --name        显示组名称而非数字,不与-ugG 一起使用
    -r, --real        显示真实ID 而非有效ID,与-ugG 一起使用
    -u, --user        仅显示有效用户ID
    
  • 相关阅读:
    Javascript 函数表达式
    当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
    Angularjs 脏值检测
    Angularjs 双向绑定机制解析
    AngularJS 初用总结
    从jquery里的$.ajax()到angularjs的$http
    XSS攻击及防御
    很赞的源码平台
    GET和POST
    [转]xxx.hbm.xml模版
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/6195213.html
Copyright © 2011-2022 走看看