目录

1、用户,组,名称解析,权限,安全上下文,

2、useradd,userdel,usermod,passwd,id,chfn,chsh,chage,finger,

3、/etc/passwd,/etc/shadow,/etc/skel,/etc/default/useradd,/etc/login.defs 

3、groupadd,groupdel,groupmod,gpasswd,newgrp

4、/etc/group,/etc/gshadow

5、su


一、概念理解

1、用户和组

为什么要有用户?

      为了实现有限资源的合理分配

用户名是什么?

       标识符

登录计算机:

            用户名:

                  用户标识符:

                        用户名、用户ID

            密码:

                  认证机制的一种


进程(动态):以特定用户身份运行

文件(静态的):以属主,属组等从属关系

:将多个用户与权限建立关联关系的容器

权限:资源的支配边界

用户有两类:

      管理员:root  UID:0

      普通用户:UID:1-65535

            系统用户:                         #仅用于运行某些服务类进程而存在,一般不用于登录系统

                  CentOS6 UID:1-499

                  CentOS7 UID:1-999   

            普通用户:                         #能交互式登录系统

                   CentOS6 UID:500+

                   CentOS7 UID:1000+                   

组有两类:

     管理员组:root GID:0

     普通组:GID  1-65535

          系统组:

                GID  1-499

                GID  1-1000

          普通组:

                GID   500+

                 GID  1000+

组的类别:一个用户可同时属于多个组

     以用户为中心:

             基本组

             附加组

名称解析

       把用户名解析为UID,或UID解析为用户名,基于名称解析库,以某个字段为搜索键(搜索标准),这些库文件位于/lib64,/usr/lib64目录(64位系统),通常以libnss开头。


2、权限

权限对于目录和文件的意义不同:

      权限                               文件                                                                   目录

r:readable      可使用查看工具看内容(cat,more)            可以使用ls命令列出其内部所有文件或子目录的相关信息

w:writable            可编辑其内容                                           可在此目录内创建或删除文件         

x:executable    可将此文件提请内核启动为进程                   可以cd进此目录,可以使用ls -l查看其内部所有文件或子目录的相关详细信息


安全上下文

      用户启动某进程访问某文件资源时,权限匹配机制:

1、首先查看此进程的属主,与被访问的文件的属主是否是同一个用户,如果是,则以被访问的文件的属   主的身份来访问,从而应用权限为属主的权限,如果不是,则2

2、查看此进程的属主是否属于被访问的文件的属组,如果是,则以被被访问的文件的属组的身份来访   问,从而应用权限为属组的权限,如果不是,则应用其它人的权限


二、用户管理

        useradd,passwd,userdel,usermod

1、用户管理命令

useradd:

useradd [OPTION]...  USERNAME

     -u UID 指定UID

     -g GID 指定基本组的GID,也可使用组名,GID或组名必须事先存在

     -G GID 指定附加组的GID,也可使用组名,GID或组名必须事先存在

     -c 指定注释信息

     -d 指定家目录

     -s 指定使用的shell

     -r   创建系统用户

               默认不创建该用户的家目录,但是shell为/bin/bash,还是可以登录系统,所有创建系统用户时,应该使用useradd -r -s /sbin/nologin USERNAME


     -m 必须给用户创建家目录

     -M 不给用户创建家目录

     -D  打印或设定用户创建时useradd的默认行为:

注意:创建用户时如果没有指定基本组,则useradd会自动添加一个与当前用户同名的组,且GID一般同UID

[root@Node3 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

passwd

            修改密码,centos默认不允许没有密码的用户登录

passwd    修改自己的密码

passwd USERNAME:修改指定用户的密码,只有管理员root有此权限

     -l    锁定帐号

     -u   解锁帐号  更改此帐号的密码也可解锁

     -S   查看用户密码状态

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

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

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

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

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

[root@localhost ~]# echo '123321'|passwd --stdin xiewei
更改用户 xiewei 的密码 。
passwd: 所有的身份验证令牌已经成功更新。

userdel

          删除用户

userdel [-r] USERNAME    删除指定用户

             -r:删除用户的同时,删除其家目录


usermod 

             修改用户信息

usermod [options] USERNAME

     -g 修改用户的基本组

              更改了用户的基本组那么,该用户的之前基本组不会变成该用户的附加组(id命令查看)

     -G 修改用户的附加组  注意:会修改用户的之前的附加组 

               -a 添加附加组而不会改变原有的附加组,但是-a一定要放在-G前面,否则报错

     -s 修改用户的默认shell 

     -c 修改用户的注释信息

     -L 锁定帐号

     -U 解锁帐号

     -M 不给用户创建家目录

     -d 修改用户的家目录,-m  修改家目录后把家目录原文件复制新位置

     -l 修改用户的登录名  #但是家目录不会更改,用户不能交互式登录,组名,uid,gid不变


id

id [OPTION] [USERNAME]

         显示指定用户或当前用户(当未指定用户时)的用户与组信息:UID ,基本组,所属附加组

   -u  仅显示UID

   -g  仅显示基本组

   -G  显示所有组包括基本组和附加组

   -n, --name  显示组名称而非数字,与-ugG 一起使用

[root@Node3 ~]# id
uid=0(root) gid=0(root) 组=0(root)
[root@Node3 ~]# id xj
uid=500(xj) gid=500(xj) 组=500(xj)
[root@Node3 ~]# usermod -G hello xj
[root@Node3 ~]# id xj
uid=500(xj) gid=500(xj) 组=500(xj),493(hello)
[root@Node3 ~]# id -n xj
id: cannot print only names or real IDs in default format
[root@Node3 ~]# id -u xj
500
[root@Node3 ~]# id -u -n xj
xj
[root@Node3 ~]# id -g -n xj
xj
[root@Node3 ~]# id -G -n xj
xj hello

chage

              修改用户帐号密码的过期信息

    -l   查看用户的过期信息

   -d   修改密码最后一次更改日期(/etc/shadow第三个字段)

chage -d 0 USERNAME    #这个命令其实是把密码修改日期归0了,这样用户一登陆就要修改密码了

[root@Node3 ~]# chage -l xj
Last password change					: Nov 29, 2016
Password expires					: never
Password inactive					: never
Account expires						: never
Minimum number of days between password change		: 0
Maximum number of days between password change		: 99999
Number of days of warning before password expires	: 7

finger

      查看用户信息

finger USERNAME 

[root@Node3 ~]# finger xj
Login: xj             			Name: 
Directory: /home/xj                 	Shell: /bin/bash
On since 三 11月 30 07:27 (CST) on pts/2 from 192.168.10.10
   2 hours idle
No mail.
No Plan.
[root@Node3 ~]# finger root
Login: root           			Name: root
Directory: /root                    	Shell: /bin/bash
On since 三 11月 30 06:16 (CST) on pts/1 from 192.168.10.10
   2 hours 33 minutes idle
On since 三 11月 30 09:09 (CST) on pts/3 from 192.168.10.10
On since 一 11月 28 21:39 (CST) on tty1    1 day 11 hours idle
On since 一 11月 28 23:14 (CST) on tty6    1 day idle
On since 三 11月 30 06:16 (CST) on pts/0 from 192.168.10.10
   1 hour 37 minutes idle
On since 三 11月 30 09:09 (CST) on pts/4 from 192.168.10.10
   9 minutes 30 seconds idle
On since 三 11月 30 09:09 (CST) on pts/5 from 192.168.10.10
   9 minutes 26 seconds idle
Mail last read 日 11月 27 22:18 2016 (CST)
No Plan.

chsh   修改shell

  -l  列出当前系统上可用shell

  -s  修改为指定shell

[root@Node3 ~]# chsh 
Changing shell for root.
New shell [/bin/bash]: ^C
[root@Node3 ~]# chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash

chfn   修改用户注释信息  

[root@Node3 ~]# chfn
Changing finger information for root.
Name [root]: 
Office []: 
Office Phone []: 
Home Phone []: a

Finger information changed.

2、用户相关的配置文件

/etc/passwd 

             密码文件

xj:x:500:500::/home/xj:/bin/bash
xiewei:x:501:501:dd:/home/xiewei:/bin/bash

共7个字段

用户帐号:密码占位符:UID:用户所属的基本组的ID:用户注释信息:用户家目录位置:用户的默认shell

注意:

      不写shell可以登录,但没有正确的命令提示符,写一个不存在的shell或/sbin/nologin,无法登录

      没有家目录也可以登录,但没有正确的命令提示符,登录后的目录为/


使用useradd创建用户默认行为相关的配置文件:

/etc/default/useradd             定义useradd添加帐号时,默认设置帐号的信息如:家目录,家目录下的文件等

/etc/login.defs                是设置用户帐号限制的文件,在这里我们可配置密码的最大过期天数,密码的最大长度约束等内容。该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准

/etc/skel                                家目录下的文件(隐藏文件)

[root@Node3 ~]# cat /etc/default/useradd   #useradd -D 改变的就是这个文件的内容
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel          #家目录下的文件就是从这个目录下的文件复制过去的  
CREATE_MAIL_SPOOL=yes      #创建邮箱队列

[root@Node3 ~]#

/etc/shadow

             影子密码文件

xj:$6$R1ac1Gw8$lSgnc4HYxPqm9IgW6TPDCd6mdqaqOqN1IxjAzGzesUTxjXkYyN7SksPaUoou0zJSFaLcWyOTxj45/KtNsKNXO1:17134:0:99999:7:::
xiewei:!!:17134:0:99999:7:::
xiena:!!:17134:0:99999:7:::

/etc/shadow文件每行共9个字段,各字段解释如下:

用户名:

加密后的密码串:

      !!表示该帐号没有密码,使用passwd -l 锁定用户就是在密码串之前加!!就无法交互式登录,

最近一次修改密码的日期:

        时间戳:起始于1790.1.1至上次密码修改所经过的天数

密码的最小使用期限:(改完密码后再次修改密码的间隔时间)

        0表示不限制,按天计算,相对于上次修改密码的日期而言的相对时长

密码最大使用期限:(用了这么久后就必须改密码)

         99999表示不限制,相对于上次修改密码的日期而言的相对时长

密码警告期限:(在该密码使用了最大使用期限的倒数7天,开始告警,提醒用户更改密码)

         0表示不警告,默认是倒数7天警告

密码的非活动区限:(在这个范围内,用户一旦登录一定要修改密码,否则操作不了)

         超过该区限,帐号将被锁定,0和默认是表示密码过期后立即失效,-1表示密码永远不会失效

帐号的过期期限:()

         为一个日期(天),时间戳,

预留字段:


          加密

明文 <----> 密文

         解密

常用的加密算法

      加密一般不依赖于算法,依赖于密钥

对称加密:加密和解密的过程,使用同一个密钥

       优点:速度快,

       缺点:密钥分发困难,无法作身份认证      

公钥加密(非对称加密):密钥都成对出现,使用公钥加密的,只能使用私钥加密,公钥产生于私钥之中,

       缺点:速度非常慢,无法作身份认证,很少用来作数据加密

单项加密:仅能由明文产生密文,反之不成;严格意义上来讲,提取数据的特征码

      使用同一个算法,多次计算得到的结果一定相同;所以经常用于验证数据完整性

                定长输出:无论源数据大小是什么,加密后结果输出大小相同

                雪崩效应:源数据一个微小的改变,结果将变化巨大

      加盐(随机码):这样保证了不同用户使用相同的密码,但密码加密后的字符串仍然不同

                常用的单项加密算法:

                       md5:message digest(信息摘要)    结果128bits

                       sha1:secure hash algorithm(安全哈希算法)             160bits                                                      sha256,sha512,

                      centos6用的就是sha512的算法输出

root:$6$mHjAkW0/LvGRuwLG$.5RxIIgi16uqNUsGGJWTxeMygTVNqImgWkEMYR8FJKeoLIZnc4Y5uctA/jJgVa.50tevX/96yq94iSSeMTIrk.:17018:0:99999:7:::

其中shadow中存放的密码密文格式如下:

$id$salt$encrypted

其中id是指使用的哈希算法():

   1   | MD5

   5   | SHA-256 (since glibc 2.7)

   6   | SHA-512 (since glibc 2.7)

salt:是使用上面hash算法对密码进行hash的一个干扰值。

encrypted: 这个值即密码的hash, 但不是直接的hash("passwd"),而是hash("passwd+salt")后,再经过编码。


三、组管理

1、组管理相关的命令

       groupadd,gpasswd,groupdel,groupmod

groupadd

groupadd [options] GROUPNAME 删除指定组

    -g GID    指定使用的GID

    -r            创建系统组


gpasswd

            为组添加密码

gpasswd [option] GROUP

      -a 添加附加用户

      -d 删除指定的附加用户

     -A:指定管理员

    -M:指定组成员和-A的用途差不多

     -r:删除密码

    -R:限制用户登入组,只有组中的成员才可以用newgrp加入该组

gpasswd -A peter users           


groupdel

              删除组

groupdel GROUPNAME


groupmod

              修改组属性

groupmod [options] GROUPNAME

     -g  修改GID

     -n  修改组名


newgrp 

     newgrp [-] [组]

           切换当前用户的基本组为指定组,如果该组为该用户的附加用户则不用输入组密码,否则需要组密码(该组没设密码就切换不了)   #重启后失效


2、组相关的配置文件

/etc/group

xiewei:x:501:
xiena:x:502:
hello:x:493:xj

组名:组密码占位符:组ID:以此组为附加组的用户列表,以逗号分隔


/etc/gshadow

nihao:!::
anyfish:!::xj

组名:组密码加密后的字符串:组管理员:组用户


四、su命令使用

su

  switch user 切换用户

su [选项]... [-] [用户名 [参数]... ]

    用户省略时,表示切换为root

- 省略时,表示非登陆时切换,意味这仍然使用原用户的环境设定

使用 - ,登陆时切换,意味着使用目标用户的环境设定,原用户失效

su -l 用户名 作用等同-    登陆时切换

注意:

          返回原用户,使用exit或logout

          root su 任何用户都不需要密码,普通用户su需要验证切换的目标用户的密码

su - 用户名 -c 'COMMAND'   以目标用户身份执行一次命令后退出,不作真正切换  

                                            #这个在使用特定用户开机启动某程序经常用到

一次用户创建经历的详细过程:

1、在/etc/passwd文件中添加一行信息

  USERNAME:x:UID:GID:c:/home/USERNAME:shell

2、在/etc/group文件中添加一行信息

    GROUPNAME:X:GID:附加用户

3、创建家目录/home/USERNAME

     复制/etc/skel目录中的隐藏文件至用户的家目录中,并修改其属主,属组及权限

4、在/etc/shadow创建用户密码及相关属性信息

知道了这个过程我们就完全可以手动创建一个用户了


五、sudo

sudo:

   将一些管理命令授权给某些普通用户使用,并且还能限定其仅能够在某些主机上执行此类的命令,操作过程还会被记录与日志中,以便于日后审计


使用sudo的过程:

 1、定义sudo授权:/etc/sudoers

语法格式: 

   who which_host=(whom) command

   谁能以谁的身份,在那些主机上执行哪些些命令,

   命令要写绝对路径,普通用户使用时也使用绝对路径

如果授权给普通用户的管理员命令较多,都列在这一行里很不方便,可以使用sudo的别名机制(只在/etc/sudoers文件中有效):     

【linux基础】07、用户管理_user

别名:仅能使用纯大写字母

 Host_Alias:定义主机别名,使用","分隔

         可以使用主机名,ip地址,长\短网络地址

 User_Alias:定义用户别名,可以是用户名,也可以是组名(%组名)

 Cmnd_Alias:定义命令别名,可以定义不能执行的命令,使用!/usr/bin/passwd root

 Runas_Alias:定义以哪些用户执行

别名还可以嵌套使用


编辑/etc/sudoers文件:

  vim /etc/sudoers:

  visudo命令:visudo是调用vi编辑命令,保存后会检查语法,有措时会提示   


例子:      

[root@Node1 ~]# visudo
# 在最后添加该行
xj ALL=(root) /usr/sbin/useradd

# 以普通用户xj登录
[xj@Node1 ~]$ useradd gentoo
-bash: /usr/sbin/useradd: Permission denied

[xj@Node1 ~]$ sudo useradd gentoo

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.

[sudo] password for xj: 

[xj@Node1 ~]$ id gentoo
uid=505(gentoo) gid=505(gentoo) groups=505(gentoo)
[xj@Node1 ~]$ sudo /usr/sbin/useradd rhel          
[xj@Node1 ~]$ id rhel
uid=506(rhel) gid=506(rhel) groups=506(rhel)
[xj@Node1 ~]$ sudo userdel gentoo              # 没授权的管理员命令还是使用不了
Sorry, user xj is not allowed to execute '/usr/sbin/userdel gentoo' as root on Node1.

标签:

   NOPASSWD:定义之后的命令在执行时可以不输入密码

   PASSWD:定义用户执行命令时需要输入密码

例子:

xj ALL=(root) NOPASSWD:/usr/sbin/useradd

2、sudo命令的使用

sudo 

   -l:可以查看sudo模式可以执行的命令

   -k:将会强迫用户在下一次使用sudo命令时必须输入密码

  sudo会记住用户输入的密码,超时时间5分钟在后续操作时可以不用输入密码,超时5分钟就需要再次输入密码

[xj@Node1 ~]$ sudo -l
Matching Defaults entries for xj on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME
    HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG
    LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User xj may run the following commands on this host:
    (root) /usr/sbin/useradd


练习:

   授权jerry用户能够以管理员的身份基于sudo执行ifconfig,后面两个命令在执行时需要输入密码,而前两个不需要。