Linux基础--用户和组管理

时间:2023-03-09 03:55:09
Linux基础--用户和组管理

1、账号管理相关文件
1)/etc/passwd
   每一行都代表一个账号,有几行就代表有几个账号在你的系统中,不过需要特别留意的是,里头很多账号本来就是系统中必须要的,我们可以简称他为系统账号, 例如bin,daemon,adm,nobody等等,这些账号是系统正常运作时所需要的,请不要随意的杀掉他。
如:
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
第1列:账号名称
第2列:密码
第3列:UID(0:这个账号是系统管理;1~499:保留给系统使用的ID;500~65535:给一般使用者用的)
第4列:GID(与/etc/group有关)
第5列:使用者信息说明栏
第6列:家目录
第7列:Shell(/sbin/nologin 账号无法登入)

 

2)/etc/shadow
如:
root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::
adm:*:12959:0:99999:7:::
第1列:账号名称(与/etc/passwd 相同)
第2列:密码(这个才是真正的密码,而且是经过编码过的密码,如果是在密码栏的第一个字符为『 * 』或者是『 ! 』,表示这个账号并不会被用来登入的意思)
第3列:最近更动密码的日期
第4列:密码不可被更动的天数
第5列:密码需要重新变更的天数
第6列:密码需要变更期限前的警告期限
第7列:密码过期的恕限时间
第8列:账号失效日期
第9列:保留

 

3)/etc/group
   这个档案就是在记录GID与群组名称的对应了
如:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
第1列:群组名称
第2列:群组密码(通常不需要设定,因为很少使用到群组登入, 不过,同样的,密码也是被纪录在/etc/gshadow当中)
第3列:GID
第4列:支持的账号名称(一个使用者是可以加入多个群组的。举例来说,如果我想要让dmtsai也加入root这个群组,那么在第一行的最后面加『,dmtsai』,注意不要有空格,使成为『 root:x:0:root,dmtsai』就可以)

 

4)/etc/gshadow
如:
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
sys:::root,bin,adm
第1列:群组名称
第2列:密码栏,同样的,开头为!表示无法登入;
第3列:群组管理员的账号
第4列:该群组的所属账号(与/etc/group内容相同)

2、新增与移除使用者 
1)useradd
[root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group] -[Mm] [-c 说明栏] [-d home] [-s shell] username
参数:
-u:后面接的是UID是一组数字。直接指定一个特定的UID给这个账号;
-g:后面接的那个群组名称就是我们上面提到的 initial group, 该group ID(GID)会被放置到/etc/passwd的第四个字段内。
-G:后面接的群组名称则是这个账号还可以支持的群组。这个参数会修改/etc/group内的相关资料。
-M:强制!不要建立使用者家目录。
-m:强制!要建立使用者家目录!
-c:这个就是/etc/passwd 的第五栏的说明内容啦~可以随便我们设定的。
-d:指定某个目录成为家目录,而不要使用默认值。
-r:建立一个系统的账号,这个账号的UID会有限制(/etc/login.defs)。
-s:后面接一个shell ,预设是/bin/bash的。

范例一:完全参考默认值建立一个使用者,名称为vbird1
[root@linux ~]# useradd vbird1
[root@linux ~]# ls -l /home
drwxr-xr-x 3 vbird1 vbird1 4096 Aug 30 17:33 vbird1
[root@linux ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:502:502::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:13025:0:99999:7:::
/etc/group:vbird1:x:502:
   做这个范例只是想要让您了解,其实系统已经规范好了一些新增使用者时的参数了,因此,当我们使用 useradd 时,系统会主动的去修改/etc/passwd与/etc/shadow,而这两个档案内的相关字段参考值,则会以一些设定档的内容来规范。同时也要注意到,使用useradd新增使用者时,这个使用者的/etc/shadow密码栏会是不可登入的 (以 !! 为开头),因此还需要使用passwd来给予vbird1密码后,才算新增完毕!

范例二:系统当中有个群组名称为users,且UID700并不存在,请用这两个参数给予vbird2建立一个账号
[root@linux ~]# useradd -u 700 -g users vbird2
[root@linux ~]# ls -l /home
drwxr-xr-x 3 vbird2 users 4096 Aug 30 17:43 vbird2
[root@linux ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:13025:0:99999:7:::

范例三:建立一个系统账号名称为vbird3
[root@linux ~]# usradd -r vbird3
[root@linux ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:101:102::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:13025::::::
/etc/group:vbird3:x:102:

  useradd这支程序在建立Linux上的账号时,至少会参考:/etc/default/useradd;/etc/login.defs;/etc/skel/* 。至少可能会更动到的地方有:/etc/passwd; /etc/shadow;/etc/group;/etc/gshadow;/home/username

2)passwd
[root@linux ~]# passwd [useraccount]
范例一:如果root要帮dmtsai修改密码
[root@linux ~]# passwd dmtsai
Changing password for user dmtsai.
New UNIX password:    <==这里直接输入新的密码,屏幕不会有任何反应
BAD PASSWORD: it is based on a dictionary word    <==密码太简单时的错误
Retype new UNIX password:    <==再输入一次同样的密码
passwd: all authentication tokens updated successfully.   <==竟然还是成功修改了

范例二: dmtsai这个使用者想要修改自己的密码时
[dmtsai@linux ~]$ passwd
Changing password for user dmtsai.
Changing password for dmtsai
(current) UNIX password:    <==这里输入『原有的旧密码』
New password:    <==这里输入新密码
BAD PASSWORD: it is based on your username    <==密码的规范是很严格的
New password:
BAD PASSWORD: it is based on your username
New password:
BAD PASSWORD: it is based on a dictionary word
passwd: Authentication token manipulation error

 

3)usermod
[root@linux ~]# usermod [-cdegGlsuLU] username
参数:
-c:后面接账号的说明,即/etc/passwd第五栏的说明栏,可以加入一些账号的说明
-d:后面接账号的家目录,即修改/etc/passwd的第六栏
-e:后面接日期,格式是YYYY-MM-DD也就是在/etc/shadow内的第八个字段数据
-g:后面接group name,修改/etc/passwd的第四个字段,亦即是GID的字段
-G:后面接group name,修改这个使用者能够支持的群组,修改的是/etc/group
-l:后面接账号名称。亦即是修改账号名称,/etc/passwd的第一栏
-s:后面接Shell 的实际档案,例如/bin/bash或/bin/csh等等
-u:后面接UID数字即/etc/passwd第三栏的资料
-L:暂时将使用者的密码冻结,让他无法登入。其实仅改/etc/shadow的密码栏
-U:将/etc/shadow密码栏的!拿掉,解冻

范例一:修改使用者dmtsai的说明栏,加上『VBird's test』的说明
[root@linux ~]# usermod -c "VBird's test" dmtsai
[root@linux ~]# grep dmtsai /etc/passwd
dmtsai:x:501:501:VBird's test:/home/dmtsai:/bin/bash

范例二:使用者dmtsai密码在2006/01/01失效
[root@linux ~]# usermod -e "2006-01-01" dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:

范例三:暂时冻结dmtsai的密码
[root@linux ~]# usermod -L dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149:
[root@linux ~]# usermod -U dmtsai    <==这样就解开了

范例四:万一dmtsai这个家伙被建立时忘记建立家目录,该如何是好?
[root@linux ~]# usermod -d /home/dmtsai2 -m dmtsai
   如果仅是-d /home/dmtsai2表示仅修改/etc/passwd第六栏的内容而已,如果加上-m参数,则表示新建一个家目录的意思。另外,如果原本的家目录是/home/dmtsai ,那-d /home/dmtsai2 -m会将原本的/home/dmtsai更名为/home/dmtsai2。

 

4)userdel
   删除使用者~与他相关的档案有:/etc/passwd;/etc/shadow;/home/username
整个指令的语法是:
[root@linux ~]# userdel [-r] username
参数:
-r:连同使用者的家目录也一起删除
范例一:删除vbird2,连同家目录一起删除
[root@linux ~]# userdel -r vbird2

3、一般身份使用者常用的账号变更命令
1)chsh
[dmtsai@linux ~]$ chsh [-ls]
参数:
-l:列出目前系统上面可用的shell,其实就是/etc/shells的内容
-s:设定修改自己的Shell
范例一:列出目前系统上面所以的shell,并且指定csh为自己的shell
[dmtsai@linux ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/ksh
/bin/tcsh
/bin/csh
/bin/zsh
[dmtsai@linux ~]$ chsh -s /bin/csh; grep dmtsai /etc/passwd
Password: <==为了防止账号被乱搞~所以需要输入 dmtsai 的密码确认!
Shell changed.
dmtsai:x:501:501::/home/dmtsai:/bin/csh

 

2)chfn
[root@linux ~]# chfn [-foph]
参数:
-f:后面接完整的大名;
-o:您办公室的房间号码;
-p:办公室的电话号码;
-h:家里的电话号码。
范例一:用dmtsai这个使用者来更改一下自己的相关信息
[dmtsai@linux ~]$ chfn
Changing finger information for dmtsai.
Password: <==为了防止账号被乱搞~所以需要输入 dmtsai 的密码确认!
Name []: VBird' Test account
Office []: Tainan office 1
Office Phone []: 06-1234567
Home Phone []: 06-7654321
Finger information changed.
[dmtsai@linux ~]$ grep dmtsai /etc/passwd
dmtsai:x:501:501:VBird' Test account,Tainan office 1,06-1234567,06-7654321:
/home/dmtsai:/bin/bash

 

3)finger
[root@linux ~]# finger [-s] username
参数:
-s:使用长串数据输出格式。 
范例一:将刚刚dmtsai建立的一些使用者信息呼叫出来视察
[root@linux ~]# finger dmtsai
Login: dmtsai Name: VBird's Test account
Directory: /home/dmtsai Shell: /bin/bash
Office: Tainan office 1, 06-1234567 Home Phone: 06-7654321
Last login Tue Aug 30 15:01 (CST) on tty1 from localhost
No mail.
No Plan.

 

4)id
  id这个指令则可以查询某人或自己的相关UID/GID等等的信息,他的参数也不少,不过,都不需要记~反正使用id就全部都列出
[root@linux ~]# id [username]
范例一:查阅自己的相关信息
[root@linux ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),10(wheel)

范例二:查阅一下dmtsai
[root@linux ~]# id dmtsai
uid=501(dmtsai) gid=501(dmtsai) groups=501(dmtsai),100(users)

4、新增与移除群组
基本上,群组的内容都与这两个档案有关:/etc/group;/etc/gshadow
1)groupadd
[root@linux ~]# groupadd [-g gid] [-r]
参数:
-g:后面接某个特定的GID,用来直接给予某个GID
-r:建立系统群组,与/etc/login.defs内的GID_MIN有关
范例一:新建一个群组,名称为group1
[root@linux ~]# groupadd group1
[root@linux ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:502:
/etc/gshadow:group1:!::

范例二:新建一个系统群组,名称为group2
[root@linux ~]# groupadd -r group2
[root@linux ~]# grep group2 /etc/group /etc/gshadow
/etc/group:group2:x:101:
/etc/gshadow:group2:!::

 

2)groupmod
   跟usermod类似的,这个指令仅是在进行group相关参数的修改而已。
[root@linux ~]# groupmod [-g gid] [-n group_name]
参数:
-g:修改既有的 GID 数字;
-n:修改既有的群组名称 
范例一:将刚刚上个指令建立的group2名称改为groupname,GID为103
[root@linux ~]# groupmod -g 103 -n groupname group2
[root@linux ~]# grep groupname /etc/group /etc/gshadow
/etc/group:groupname:x:103:
/etc/gshadow:groupname:!::

 

3)groupdel
    groupdel自然就是在删除群组。
[root@linux ~]# groupdel [groupname]
范例一:将刚刚的groupname删除
[root@linux ~]# groupdel groupname

范例二:若要删除dmtsai这个群组
[root@linux ~]# groupdel dmtsai
groupdel: cannot remove user's primary group.

4)gpasswd
   如果系统管理员太忙了,无法针对每个群组来管理,那么系统管理员还可以将某位使用者设定成为该群组的团长。
关于系统管理员(root)做的动作:
[root@linux ~]# gpasswd groupname
[root@linux ~]# gpasswd [-A user1,...] [-M user3,user4...] groupname
[root@linux ~]# gpasswd [-rR] groupname
参数:
:若没有任何参数时,表示给予groupname一个密码(/etc/gshadow)
-A:将groupname的主控权交由后面的使用者管理(该群组的管理员)
-M:将某些账号加入这个群组当中
-r:将groupname的密码移除
-R:让groupname的密码栏失效,所以newgrp就不能使用了

关于群组管理员(Group administrator)做的动作:
[someone@linux ~]$ gpasswd [-ad] user groupname
参数:
-a:将某位使用者加入到 groupname 这个群组当中!
-d:将某位使用者移除出 groupname 这个群组当中。
范例一:建立一个新群组,名称为testgroup且群组交由dmtsai管理
[root@linux ~]# groupadd testgroup
[root@linux ~]# gpasswd testgroup
Changing the password for group testgroup
New Password:
Re-enter new password:
[root@linux ~]# gpasswd -A dmtsai -M dmtsai,vbird testgroup
[root@linux ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:502:dmtsai,vbird
/etc/gshadow:testgroup:1CEVbrcjxO6Ps:dmtsai:dmtsai,vbird

范例二:以dmtsai登入系统,并且让他加入vbird1成为testgroup成员之一
[dmtsai@linux ~]$ gpasswd -a vbird1 testgroup
Adding user vbird1 to group testgroup

5、密码管理
[root@linux ~]# passwd [-lunxwS] username
参数:
-l:将username 这个账号的密码锁住(lock),在/etc/shadow内的密码栏修订~
-u:将-l的lock解开!
-n:后面接天数(数字),最短天数;亦即是/etc/shadow内的第四栏;
-x:后面接天数(数字),最长天数;亦即是/etc/shadow内的第五栏;
-w:后面接天数(数字),警告天数;亦即是/etc/shadow内的第六栏;
-S:显示目前这个username 的相关信息。 
范例一:将dmtsai这个使用者的密码冻结,并观察他
[root@linux ~]# passwd -l dmtsai
Locking password for user dmtsai.
passwd: Success
[root@linux ~]# passwd -S dmtsai
Password locked.
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!!$1$TDy6D7eg$jVJV/FMaQn14v5Kl7sqw6/:13026:0:99999:7::13149:

范例二:将上述密码冻结解开
[root@linux ~]# passwd -u dmtsai

6、使用者身份切换
1)su
[root@linux ~]# su [-lcm] [username]
参数:
-:如果执行su -时,表示该使用者想要变换身份成为root,且使用root的环境设定参数档,如/root/.bash_profile等等。
-l:后面可以接使用者,例如su -l dmtsai,这个-l好处是可使用欲变换身份者他的所有相关环境设定档。
-m:-m与-p是一样的,表示使用目前的环境设定,而不重新读取新使用者的设定档。
-c:仅进行一次指令,所以-c后面可以加上指令
范例一:由原本的dmtsai这个使用者,变换身份成为root 。
[dmtsai@linux ~]$ su
Password: <==这里输入 root 的密码喔!
[root@linux ~]# env
USER=dmtsai
USERNAME=root
MAIL=/var/spool/mail/dmtsai
LOGNAME=dmtsai
   如果使用su没有加上-的话,那么很多原本使用者的相关设定会继续存在,这也会造成后来的root身份在执行时的困扰。最常见的就是PATH这个变量的问题。
[root@linux ~]# exit    <==这样可以离开 su 的环境!
[dmtsai@linux ~]$ su -
Password:    <==这里输入 root 的密码喔!
[root@linux ~]# env
USER=root
MAIL=/var/spool/mail/root
LOGNAME=root

范例二:使用root的身份,执行head -n 3 /etc/shadow
[dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow"
Password:    <==这里输入 root 的密码喔!
root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7:::
bin:*:12959:0:99999:7:::
daemon:*:12959:0:99999:7:::

范例三:原本是dmtsai这个使用者,想要变换身份成为vbird时?
[dmtsai@linux ~]$ su -l vbird
Password:     <==这里输入 vbird 的密码喔!

 

2)sudo
   当使用者执行sudo时,系统会主动的去寻找/etc/sudoers档案,判断该使用者是否有执行sudo的权限;若使用者具有可执行sudo的权限后,便让使用者输入使用者自己的密码来确认;若密码输入成功,便开始进行sudo后续接的指令;不过,root执行sudo时,不需要输入密码;若欲切换的身份与执行者身份相同,也不需要输入密码。
[root@linux ~]# sudo [-u [username|#uid]] command
参数:
-u:后面可以接使用者账号名称或者是UID。例如UID是500的身份,可以:-u #500来作为切换到UID为500的那位使用者。 
范例一:一般身份使用者使用sudo在/root底下建立目录
[dmtsai@linux ~]$ sudo mkdir /root/testing
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.
Password: <==这里输入 dmtsai 自己的密码
dmtsai is not in the sudoers file. This incident will be reported.
    因为dmtsai不在/etc/sudoers,所以他就无法执行sudo。
 
范例二:假设dmtsai已经具有sudo的执行权限,如何在/root底下建立目录?
[dmtsai@linux ~]$ sudo mkdir /root/testing
Password: <==这里输入 dmtsai 自己的密码

范例三:如何将sudo与su搭配使用?
[dmtsai@linux ~]$ sudo su -

范例四:dmtsai想要切换身份成为vbird来进行touch时?
[dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test

 

3)visudo
sudo的执行权限与/etc/sudoers这的档案有关,因为/etc/sudoers需要一些比较特别的语法,因此,如果你直接以vi去编辑他时,如果输入的字句错误,可能会造成无法启用sudo的困扰,因此建议使用visudo 去编辑/etc/sudoers(必须要使用root的身份来执行)
[root@linux ~]# visudo
# sudoers file.
# This file MUST be edited with the 'visudo' command as root.
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# Runas alias specification
# User privilege specification
root ALL=(ALL) ALL
dmtsai ALL=(ALL) ALL <==这里将 dmtsai 制作成完全可用!
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now

7、特殊的 shell, /sbin/nologin
   这个shell通常是给系统账号使用的,因为这个/sbin/nologin事实上并无法给予账号实际登入,如果你利用usermod修改了dmtsai这个使用者的shell成为/sbin/nologin之后,再次想要以dmtsai重新登入系统时,他在屏幕上会出现这样的讯息:This account is currently not available.
   这个账号并不能被允许登入,不过,这个账号却可以进行其它的工作,举例来说,各个系统账号,打印工作由lp这个账号在管理,WWW由apache这个账号在管理, 他们都可以进行系统程序的工作,但是就是无法登入主机。

8、PAM模块简介
    当一个使用者想要登入Linux主机时,他受到什么限制呢?我们说,他除了必须要通过/etc/passwd及/etc/shadow的验证并取得相关的权限数据,最后获得一个shell 之外,事实上,他在登入系统之前,就得要通过PAM (Pluggable Authentication Modules, 嵌入式模块)的验证才行。
    PAM模块的用途非常的多,除了可以在使用者登入时进行身份的验证之外,也可以辅助一些应用程序的验证之用,举例来说,我们前面提到的密码修改程序passwd,当我们执行密码修订的时候,这个程序不是会告诉我们您输入的密码是否合于规范吗? 如果是记录在字典当中的密码,或者是与账号相同的密码,那么就会被PAM模块打回票,也就无法通过验证了, 那么PAM怎么运作呢?我们同样以/usr/bin/passwd这支程序来作为简单的说明好了:
1)使用者开始执行/usr/bin/passwd这支程序,并输入密码;
2)passwd开始呼叫PAM模块,PAM模块会搜寻passwd程序的PAM相关设定档案,这个设定档一般是在/etc/pam.d/里面的与程序同名的档案,所以在本例中,PAM会去搜寻
/etc/pam.d/passwd这个设定档;
3)经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证;
4)将验证结果回传给passwd这支程序,而passwd这支程序会根据PAM回传的结果决定下一个动作。

这个过程提供我们几个重要的信息:
1)PAM 的设定档放置在/etc/pam.d/这个目录中;
2)至于更多的环境相关设定则放置在/etc/security/* 内;
3)PAM是透过自己提供的相关模块来进行验证,模块放置在/lib/security/*内。