一、帐号的管理


(一)帐号管理的四个关键文件

/etc/passwd         //用户信息存放点
/etc/shadow         //用户信息存放点,加密

/etc/group         //组信息存放点
/etc/gshadow       //组信息存放点,加密


1、 /etc/passwd文件详解


每一行代表一个用户帐号。
每列用“:”号分隔,意思分别为:

用户名:密码:用户ID:组ID:用户备注信息:用户宿主目录(home文件)路径:用户指定的shell程序

密码列:X,表示加密,密码记录在/etc/shadow中。
用户ID:0号ID为系统管理ID,1~499为保留给系统的ID,500~65535为分配给用户的ID。centeos7 1-999为系统ID。


例:
root:x:0:0:root:/root:/bin/bash             //用户名为root,密码加密,用户ID和组ID均为0表示系统管理ID,备注为root,home目录为 /root ,使用/bin/bash作为shell程序。
khp:x:500:500:khp:/home/khp:/bin/bash

2、 /etc/shadow 详解

每一行代表一个用户帐号。
每列用“:”号分隔,意思分别为:
用户名:加密口令:上次口令变更时间(从1970.1.1日算起天数):在多长时间内不能更改口令(天数):多长时间后必须更改口令(天数):口令到期前多久发送改密码的警告信息:口令到期后多久失效:帐号失效时间:保留

例:
khp:$1$CUcFhZc0$mi2fq5I5FhFKbDWcwnABO/:14587:0:99999:7:::
用户名:khp
密码: $1$CUcFhZc0$mi2fq5I5FhFKbDWcwnABO/
上次更改口令时的时间:从1970年1月1日算起后的14587天,即2009年。
在多长时间内不能更改口令:0,即随时可以更改口令
多长时间后必须更改口令:999,即无限期,可以一直不更改
口令到期前多久发送改密码的警告信息:7,即口令到期的前7天发送警告信息
口令到期多久后失效:此处为空,即不设定。假如我设定的口令是2009年12月31日失效,此处值设为2,则到2010年1月2日后密码就失效。
帐号失效时间:此处为空,假如我设定为2010年1月30日帐号失效,不管你有没有改密码,到2010年1月30日这个帐号都失效。
保留:留作以后新增其他用途。

因/etc/shadow是只读文件,编辑后保存需要用  :wq!   保存。


3、 /etc/group详解

每一行代表一个组ID,每列的意思分别为:

用户组名称:组密码:组ID:组用户名(即组包含哪些用户)

例:
khp:x:500:

4、  /etc/gshadow  详解
 
用户组名称:组密码:用户组管理员帐号:组用户名(该组的所属帐号,即包含哪些用户)

组密码:当为空或为“!"时,表示为法登录
组管理帐号:有多个管理帐号,用“,”分开。
组用户名:可以有多个组用户,用“,”分开。

例:bin:::root,bin,daemon  //组名为bin,密码为空,用户组管理员帐号为空,组用户为root,bin,daemon

(二)初始化组和有效用户组

1、初始化组:每个用户新建立时就拥有了一个初始化组。/etc/passwd里面的第四列的组名就是各用户的初始化组ID。
    例:khp:x:500:500:khp:/home/khp:/bin/bash   //khp用户的初始化组即为ID为500的组。
2、附加组:一个用户可以加入到多个组中(叫附加组)

    在/etc/group中,找到想加入的组名,然后在最后一列添加用户,即可把这一用户加入这一组。
    例:vi /etc/group  找到 pla:x:501:khp  即把khp用户加入到了pla组中。这样khp就属于了khp 和pla两个组了。

3、有效用户组:表示用户此时此刻所在的用户组是什么,有效用户组拥有此用户的权限继承和所属权。用户新建的文件归属和权限继承于有效用户组。请注意,可能此用户并不属于某组的附加组,但这个用户却可以是属于这个有效用户组。例:Khp用户,你查etc/group发现khp并不改于kkk这个组,但你用newgrp  kkk命令,可以把使Khp用户的有效用户组为kkk组。用newgrp转换有效用户组转换的背后原理是“创建一个新的子shell”,恢复到原来用户组的方法是用exit或ctrl-D来注销当前的shell。
当khp创建一个新的文件时,这个文件属于哪个组呢?应该属于有效用户组。

4、有效用户组相关命令
(1)groups命令查看有效用户组,排在第一个的组,就是有效用户组。
     例:groups        //查看当前用户的有效用户组  ,如果得到结果如下:
         khp   pla     //khp属于有效用户组


(2)groups 用户名    //可以查出用户所属的组,且第一个组名为有效用户组。

(3)newgrp  组名     //更改有效用户组,这要在当前用户环境下使用此命令
    例:newgrp  pla   // 就可以把当前用户的有效用户组名改为pla
    例: khp#newgrp kkk  //把khp用户的有效用户组改为kkk
         khp#groups//结果为 kkk   khp  ,即khp用户的有效用户组不再是初始用户组,而变成了


(三) 新增与删除用户及用户组

新增与删除用户有两种方法,一种为用命令,一种是手工修改方法。

1、手工修改方法

新增用用户:

(1)用vi 编辑器打开  /etc/passwd
(2)增加一行,复制一行当前用户信息,然后更改用户名和用户ID,以及组ID即可。
(3)打开/etc/shadow 用同样的方法增加加一行,更改用户名。也可以在设置完/etc/passwd之后直接用  pwconv命令转换即可。
(4)打开  /etc/group 和 /etc/gshadow,增加一行。最好的方法就是复制上面的一行,然后更改第一列的用户名和第三列的组ID.
     也可以在设置完/etc/group之后直接用 grpconv命令,生成相应用户组在/etc/gshadow中的项目。
(5)设置新用户的主目录。用mkdir命令在/home目录下建一个与用户名相同的文件夹
(6)用password 用户名  命令指定新用户的密码
(7)复制基本初始化文件到新用户目录下。初始化文件一般都在/etc/skel下。
     例:cp  /etc/skel/.*   /home/khp   即把/etc/skel下的所有文件复制到新用户目录/home/khp下面
(8)用chown命令和chgrp命令让新用户拥有访问新建主目录的权限,指定所有权

注:/etc/skel文件,即用户的基本初始化文件。如windows中的docements and setting 中的all users文件夹一样,新建一个用户,会把/etc/skel中的一些公用方件复制到新用户目录中,可以把一个新用户的公司策略放于此资料夹中,新建 用户时,新用户目录中会自动包含这引起公共文件。

删除新用户:

打开/etc/passwd      /etc/shadow     /etc/group   /etc/gshadow    把相关的用户和组信息删除,然后把相应的用户主目录删除即可。



2、命令方法

  用户命令:

   (1)useradd [-u  UID] [-g init_group] [-G other_group]  [-c 说明内容] [-mM] [-d name] [-r] [-s shell]  username

-u:后面接UID,是一组数字。给这个帐号指定一个UID
-g:后面接初始用户组 ,这个组名要事先存在的。  
-G:后面接支持的用户组,即有效用户组,也叫附加入组。
-c:后面接说明内容。/etc/passwd的第五列
-d:指定用户家目录
-m:要建立用户目录
-M:不要建立用户目录
-r:建立一个系统帐号。
-s:指定一个shell。默认是/bin/bash


如果不跟参数直接用 useradd username命令:

默认会建一个与用户名相同的初始用户组。但如SUSE版本的就不会建立新用户组,而以/etc/default/useradd内的GROUP设置值作为用户的初始用户组。
其他相关设置参照文件/etc/default/useradd文件
用户UID/GID的设置,则是参照/etc/login.defs文件。生成新用户时的基本参数来自/etc/login.defs配置文件中,包含了:口令寿命,用户ID,组ID。生成主目录的设置等。可以通过其他配置文件调整这一默认配置参数。


例:useradd khp    //新增用户
       passwd khp  //为新增用户设定密码
例:useradd -s /bin/sh -g gem  –G adm,root gem
    //创建一个用户 gem ,这个用户的的shell为/bin/sh   初始化用户组为gem, 附加组为adm 和root。 初始化组gem,一定要事先存在的。

(2) 删除用户     userdel  username   即可删除用户名, userdel khp -r  //删除用户同时删除家目录。
(3)修改用户      usermod  username   可以修改用户设置。 参数和 useradd中的差不多。
(4)查看用户参数   finger  username   可查看用户的参数。因为这个参数比较危险,一般不装
(5) 查看ID号       id     username    查看ID号。

组命令:

(6)groupadd  [-g gid][-r] groupname      //增加组名

-g :后面接某个特定的GID,用来直接给予某个GID
-r:建立系统用户组。

(7)  groupdel  groupname                     //删除组名
(8)  groupmod [-g gid][-n groupname]         //修改组参数
(9)  gpasswd[-adAMRr]groupname               //给组设密码,还有以下功能:
        -a:将某用户加入到groupname用户组中
        -d:将某用户从groupname用户组中删除        

        -A: 设定组管理员帐号,该用户管理该组
        -M:将某些帐号加入这个用户组中
        -r:将groupname的密码删除
        -R:让groupname的密码栏失效,所以newgrp命令就不能用了。
例:gpasswd  groupname               //给组设织密码
例:gpasswd  -a khp kkk             //把用户khp 加入到kkk组中。
例:gpasswd -A khp -M  khp,pla  elitekgroup   //把khp  pla两个帐号加入elitekgroup组中,且让khp用户管理这个组。

(四)阴影口令组

管理linux用户与组的所有命令。主要有/etc/passwd与/etc/group相结合。使口令更安全。
1、pwck       //检查/etc/passwd帐号设置文件内容的信息

2、转换用户口令
pwconv       //转换现有/etc/passwd文件中的所有用户口令到加密文件/etc/shadow中。让密码变成“X”。即变成加密口令。
pwunconv     //把/etc/shadow中的密码重新写回到/etc/passwd中,并且把/etc/shadow文件删除。最好不要用这个命令。

3、 转换组口令
grpconv:转换现有  /etc/group文件相关信息到 /etc/gshadow
grpunconv:把/etc/shadow中的信息转换到  /etc/group中,并删除  /etc/gshadow文件,最好不要用。


(五)  切换用户

1、su命令

su [-lcm] username
su:切换成其他用户身份,但变量环境仍是现在用户名的。如果后面不加用户名,则是变换成root身份。
su-:变化成其他用户身份,同时变换到要变换用户名的环境变量。如果后面不加用户名,就是变换成root身份。
su -l :与 su -用法一样,变换用户身份的同时,变换变量环境。
su -m :与 su 用法一样,变换用户身份,但不变换变量环境。
su  -c :即变换用户身份后,在新用户身份下执行一次命令。所以后面要接命令,一起使用。

例:  su     //会提示输入root密码,即变换成root身份,但不更改变量环境。
     su -   // 会提示输入root密码,输入root密码后变换成root身份,同时更改成root身份的变量环境。
    
     su - khp //会提示输入密码,输入khp用户的密码后变换成khp的身份,同时更改成khp身份的变量环境。
     su - khp -c  ls   //变换到khp 用户身份,并且更改到khp环境,然后执行ls命令,列出khp目录下面的文件。

    
2、sudo命令

执行su命令时需要知道变换用户身份的密码,输入密码正确才可以变换身份。这样做会不安全。
sudo 在变换用户身份时,只输入自已本身的密码,而不是准备变换用户身份的密码。如:我在khp用户下,准备变换到root用户身份,则输入khp自已的密码即可,而不是输入root的密码。
但使用sudo命令是有条件的,并不是所有用户都可以执行这个命令。用户执行sudo命令时,会查找/etc/sudoer文件,判断该用户是否有执行sudo命令的权限,有权限时输入自已密码就可以变换身份了。
root用户执行sudo命令时不需要输入密码。默认只有root用户可以执行sudo命令。
此处的关键是/etc/sudoer文件。用visudo 命令编这个文件。
(1)/etc/sudoer文件

/etc/sudoer文件的授权:

用户帐号 登录的主机 = (可变换的用户或组)[NOPASSWD:]  可以执行的命令

例:khp  ALL=(ALL)  ALL   //即khp用户可以变换成任何身份,可以执行任何令。 最好不要这样设定,很不安全。
    khp  ALL= ALL   //如果忘了输入变换的身份,则表示只能变换成root身份。
    %khp  ALL = (ALL) NOPASSWD: ALL  //即khp用户组的所有用户在变换身份时都不需要输入密码,就加上NOPASSWD:参数。用户组则在前面加%.


/etc/sudoer文件的别名规则:

上例中全用ALL表示的有的登录主机,所有的可变换身份,所有的可执行命令,这样很不安全,但如果给一批用户授权相同的命令,且命令很多时,就会输入很久。
可以先用别名定义好,然后在规则中套用别名即可以,就不用重复工作。
别名类型有:
Host_Alias:定义主机别名
User_Alias:定义用户别名
Runas_Alias:定义变换身份别名
Cmnd_Alias:定义命令别名
例:我想授权khp用户可切换成root,pla身份,且可以执行命令  shutdown,rm,ls命令。

Runas_Alias ad = root,pla
Cmnd_Alias  down = /sbin/shutdown,/sbin/rm,/sbin/ls   //命令别名必须用绝对路径。取消某个命令的执行时,在前面加!。

khp  ALL = (ad) down  //授权khp用户可切换成root,pla身份,且可以执行命令  shutdown,rm,ls命令

sudo -l命令可以查看用户可以执行哪些sudo命令。