linux用户权限管理

目录:

一、用户相关

配置文件、命令(groupadd、groupmod、groupdel、useradd、usermod、userdel、passwd、gpasswd、newgrp)

二、权限相关

命令(chmod、chown、chgrp、umask),额外(id、su)

三、杂项

随笔记录

用户权限管理单从字面上就能明白是什么,而且大致也就是这么个意思。而只要是从事电脑方面工作的人也都用的到,我想谁也不想自己管理的主机没事多些小东西吧。

用户只是系统上面用来标识一个身份的名称,而身份说白了就是权限。而组也是一样,只不过这是一个容器,可以给予用户一些额外的权限。

在我们的linux主机上面用户分为两类,管理员和普通用户。而普通用户又分为两大类,系统用户和可登录用户。

系统用户一般都是一些服务类程序所使用的,它不能用来登录系统。一个程序使用一个用户,这样可以保证不同的服务程序所拥有的权限都是最小的,防止这个程序会反过来对付我们自己。

而登录用户也就是我们自己用的了。

也分为系统组与普通组,不过其实也没有什么区别,只不过默认的配置文件中对它们的GID的编号起始和结束不同。

站在用户的角度来看,分为基本组和附加组,区别就我个人知道的就只有创建文件的时候,文件属组是基本组。  而对于权限都是一样的,用户加入一个组就拥有了这个组的权限。

在说各种管理权限的命令之前先来看看权限是如何生效的吧。在linux上面一切皆文件,所以文件的权限是至关重要的,那么一个进程对于文件的操作能否生效就取决于这个了(暂时还没有接触过用户的朋友可以先略过去,回头再看这个):


进程安全上下文:

进程的属主与文件的属主是否相同;如果相同,则应用属主权限;
否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组权限;
否则,就只能应用other的权限;


以下是一些个人的理解,如果有错误还请各位朋友或老师提醒一下,先谢谢了。

1、运行中的进程也有其属主和属组的(发起者和所属的基本组,创建文件的时候就是这个属主和属组了),可以用ps ax -opid,user,group,command 来查看命令的属主和属组

2、进程的属主和属组是由这个进程的发起者来决定的。如:sst用户用cat查看一个文件,cat进程的属主和属组就是sst这个用户和所属的基本组。但是访问这个文件的时候权限模型不是这样的。

3、进程对文件所拥有的权限取决于有效的属主和属主所属的所有组。

5、在进程访问这个文件的时候,文件系统会跑出来对比双方的权限:首先进程的属主与文件的属主是否相同;

wKioL1Z2c0OwingXAABnahhQzxk528.jpg

如果相同,则应用属主权限,否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组权限;否则,就只能应用other的权限;(在这里我犯了一个很离谱的错误:在属组部分理解成了进程的属主是否是文件的属组,一个‘属于’一个‘是’真是天壤之别啊)

为了防止我再犯这种错误:

wKiom1Z2c_SwWh2MAACDRYaQwBs325.jpg

star发起的进程的属主也就是star, 在上面就是star是否属于文件abc123的属组,很显然star是属于abcd这个组的。


一、用户相关:

配置文件

/etc/passwd 用户相关信息
/etc/shadow 用户安全相关信息,包括密码
/etc/group 组相关信息
/etc/gshadow 组安全相关信息,包括密码
/etc/login.defs 创建用户的一些相关信息的默认设置,用户UID/GID 密码参数等。
/etc/default/useradd 创建用户时环境变量的默认设置,如家目录、shell、邮件、skel(就是下面这个)。useradd  -D的设置就会写入这个文件
/etc/skel/ 新创建的用户,家目录中存在的文件默认就是从这个目录复制的。
/etc/shells
当前系统上安全的shell列表。


简单介绍一下其中的几个文件的内容格式:

1、/etc/passwd

sst:x:4004:4004::/home/sst:/bin/bash

用户名:密码占位符:UID:GID:注释信息:家目录:shell

2、/etc/shadow

abc:!!:16778:0:99999:7:::

用户名:加密后的密码:最近一次修改时间:密码最短使用期限:密码最长使用期限:警告时间:非活动时长:过期时间:保留字段

1. 如果此段是以!开头表示此用户是被锁定的。加密后的密码由三部分组成,由$分隔:

  • 1-6的数字表示加密算法(md5,sha1,sha224,sha256,sha384,sha512),从左到右1-6。CentOS5上面好像是md5来着,而6和7用的sha512的。

  • salt,加点盐。加了防止两个用户是一样的密码的情况,这样加密后的字符串也是一样的,一个用户看到另一个用户跟自己的字符串一样,也就知道那个用户的密码了。

  • 密码与salt组合在一起加密所生成的字符串。

2. 最近一次修改时间:是从1970年1月1 日到上次修改密码的时间之间所经过的天数,如果为0表示此用户在下次登录的时候必须要修改密码。一般过于创建新用户,让用户登录成功以后修改密码。

3. 密码最短使用期限:表示两次修改密码的最短间隔,可能是为了防止一直修改密码把密码历史转一圈以后再重新使用原来的密码。为0表示不限。

4. 密码最长使用期限:表示两次修改密码的最长间隔。

5. 警告时间:表示在密码快要过期之前的多少天开始警告用户修改密码。

6. 非活动时长:也可以称为宽限时间。表示在密码过期以后,还允许用户登录的时间,只不过在这段时间里登录系统以后就必须要修改密码才能使用系统。

7. 过期时间:表示一个用户的过期时间。主要用于临时用户的,如一个临时用户最多也就使用系统1个月,就可以设置上过期时间,到时自动禁用用户。


3、/etc/group

sst:x:4004:

组名:密码占位符:GID:额外的成员列表。

额外的成员列表是指以此组为附加组的用户,基本组不在这里显示。

4、/etc/gshadow

sst:!::

组名:加密后的密码:用户组管理者:额外的成员列表。


5、/etc/default/useradd

  1 # useradd defaults file
  2 GROUP=100            #创建组,GID从100开始
  3 HOME=/home            # 默认家目录创建路径
  4 INACTIVE=3            #用户非活动时间,也就是过期以后3天内还可以登录系统。只不过不能使用系统,要修改密码。
  5 EXPIRE=                #默认用户过期时间。 useradd -D -e 可以修改过期时间。
  6 SHELL=/bin/bash        #用户默认shell
  7 SKEL=/etc/skel         #新创建的用户,用户家目录从这个目录复制数据,环境变量文件。
  8 CREATE_MAIL_SPOOL=yes   #是否会新用户自动创建mail文件。



用户相关命令

参数可能有点多,但有些都是通用的,一通百通啊。

1groupadd:创建组

groupadd[options] group

常用选项:

-gGID:指定GID,默认是根据上一个组的GID号加1来计算的。

-r :创建系统组。

例:创建一个mariadb系统组,gid为306。

[root@localhost~]# groupadd -r -g 306mariadb

 [root@localhost~]# tail -1 /etc/group

mariadb:x:306:

2groupmod:修改组属性

groupmod[options] GROUP

常用选项:

-gGID:修改GID;

-nnew_name:修改组名;

例:发现系统有mysql组了,想把上面的mariadb组改成apache组,gid也改成80。

 [root@localhost~]#  groupmod -n apache -g 80 mariadb

3groupdel:删除组

groupdel[options] GROUP

命令很简单就不多写了。

4useradd:创建用户

常用选项:

-u,--uid UID:指定UID;

-g,--gid GROUP:指定基本组ID,此组得事先存在;

-G,--groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔;

-c,--comment COMMENT:注释信息;

-d,--home HOME_DIR:指定家目录;通过复制/etc/skel此目录并重命名实现;指定的家目录路径如果事先存在,则不会为用户复制环境配置文件;

-s,--shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中;

-r,--system:创建系统用户;

-f,--inactive INACTIVE:非活动时间,宽限时长。

-e, --expiredate EXPIRE_DATE : 过期时间

例:创建apache用户,组为apache,系统用户,指定UID为80,shell为/sbin/nologin。

[root@localhost~]# useradd -g apache -r -s/sbin/nologin -u 80 apache

[root@localhost~]# id apache

uid=80(apache)gid=80(apache)groups=80(apache)

注意:创建用户时的默认设定在配置文件/etc/login.defs

useradd -D:显示创建用户的默认配置;

useradd-D [options]: 修改默认选项的值;

修改的结果保存于/etc/default/useradd文件中;

[root@localhost~]# useradd -D

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/csh

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

我这里做实验的时候把shell给改了,现在我想改回/bin/bash,并且把非活动时间启用,值为3天。

[root@localhost~]# useradd -D -s /bin/bash-f 3

[root@localhost~]# useradd -D

GROUP=100

HOME=/home

INACTIVE=3

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

[root@localhost~]# useraddrt            #我这里创建一个用户看看。

[root@localhost~]# grep"^rt\>" /etc/passwd

rt:x:4006:4006::/home/rt:/bin/bash           #shell为/bin/bash。

[root@localhost~]# grep"^rt\>" /etc/shadow

rt:!!:16781:0:99999:7:3::                                   #非活动时间为3

5usermod:修改用户属性

常用选项:

-u,--uid UID:修改用户的ID为此处指定的新UID;

-g,--gid GROUP:修改用户所属的基本组;

-G,--groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖,一般与-a同用。

-a,--append:与-G一同使用,用于为用户追加新的附加组;

-c,--comment COMMENT:修改注释信息;

-d,--home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;一般与-m同用。

-m,--move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录;

-l,--login NEW_LOGIN:修改用户名;

-s,--shell SHELL:修改用户的默认shell;

-L,--lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";

-U,--unlock:解锁用户的密码;

例:想为apache用户添加一些注释信息,并且添加附加组mysql.

[root@localhost~]# usermod -c "thisis a system user" -a -G mysql apache

[root@localhost~]# id apache

uid=80(apache)gid=80(apache)groups=80(apache),27(mysql)             #附加组mysql,apache原来没有附加组,-a选项可以不用。

[root@localhost~]# grep '^apache\>'/etc/passwd

apache:x:80:80:thisis a systemuser:/home/apache:/sbin/nologin      #注释信息

注意:UID正常情况下不要改,除家目录以外的文件的属主属组不会随用户的修改而修改。

有些修改需要被修改用户退出登录。

6userdel:删除用户

userdel[options]LOGIN                        

常用选项:

-r:删除用户时一并删除其家目录;

7passwd:用户密码相关设置

passwd [-k][-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays][-iinactivedays] [-S] [--stdin] [username]

使用方式:

(1) passwd:修改用户自己的密码;

 (2)passwdUSERNAME:修改指定用户的密码,但仅root有此权限;

常用选项:

-l,-u:锁定和解锁用户;

-d:清除用户密码串;

-e :使某用户密码过期,也就是说用户下一次登录就必须要修改密码了;

-iDAYS:非活动期限;

-nDAYS:密码的最短使用期限;

-xDAYS:密码的最长使用期限;

-wDAYS:警告期限;

--stdin:可获取标准输入,如: echo"密码" | passwd 用户名 --stdin。 一般在脚本中用到。

一般的操作我想朋友们都会,就不多说了。下面就举个不常用到的例子来结束这个命令吧。

例:sst用户的工作安全非常重要,要让sst用户下次登录就必须修改密码,并且最长使用期限设置为10天,警告为过期前4天开始。

原来的信息:

[root@localhost~]# grep '^sst\>'/etc/shadow

sst:$6$wiNNKgmB$uwOpj5oEnRzk.QuiBmVpIg1B4WC9ebFcy8TSwK1T0BjsMNNWXUpfwU1W7/pTVlMM46OlAM9Sq9Mm545L2/xaL/:16781:0:99999:7:3::

修改:很多属不能同时设置,所以下面分开设置了。

[root@localhost~]# passwd -e sst

Expiringpassword for user sst.

passwd:Success

[root@localhost~]# passwd -x 10 sst

Adjustingaging data for user sst.

passwd:Success

[root@localhost~]# passwd -w 4 sst

Adjustingaging data for user sst.

passwd:Success

[root@localhost~]# grep '^sst\>'/etc/shadow

sst:$6$wiNNKgmB$uwOpj5oEnRzk.QuiBmVpIg1B4WC9ebFcy8TSwK1T0BjsMNNWXUpfwU1W7/pTVlMM46OlAM9Sq9Mm545L2/xaL/:0:0:10:4:3::   

 #最近一次修改(0)表示用户下此登录必须要修改密码,然后依次是最短期限(0)、最长期限(10)、警告(4)、非活动(3)这里是因为上面我们把默认值给改成3了。

8gpasswd:组管理命令(可以用usermod命令来代替,所以一般过不到):

gpasswd[option] group       

gpasswdGROUP 为组设置密码。

常用选项:

-aUSERNAME:向组中添加用户

-dUSERNAME:从组中移除用户,这个可能会用的到。

-r,--remove-password : 移除组密码。

例:添加用户sst到test组。

[root@localhost~]# gpasswd -a sst test

Addinguser sst to group test

[root@localhost~]# id sst

uid=4007(sst)gid=4007(sst)groups=4007(sst),5004(test)

移除:

[root@localhost~]# gpasswd -d sst test

Removinguser sst from group test

[root@localhost~]# id sst

uid=4007(sst)gid=4007(sst)groups=4007(sst)

9newgrp:临时切换指定的组为基本组:

newgrp[-] [group]

-: 会模拟用户重新登录以实现重新初始化其工作环境;

有时候可能会用到,临时的把自己的基本组改成别的。上面给组设置密码的功能,在这就可以用到了。

如果组本来就是用户的附加组,切换成基本组不需要密码。如果用户与某组本来就没有关系,而想要以此组为基本组的话。则需要输入此组的组密码。如果组没有密码是不能切换的,当然了root除外。

[sst@localhost~]$ id

uid=4007(sst)gid=4007(sst)groups=4007(sst)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[sst@localhost~]$ newgrp - test

Password:

[sst@localhost~]$ id

uid=4007(sst)gid=5004(test)groups=4007(sst),5004(test)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[sst@localhost~]$ touch aaa

[sst@localhost~]$ ll aaa

-rw-r--r--.1 sst test 0 Dec 12 21:55 aaa

这里直接用id查看当前环境的,如果用id sst看sst用户的基本组还是sst。退出就直接用exit就可以了。

[sst@localhost~]$ exit

logout

[sst@localhost~]$ touch abcd

[sst@localhost~]$ ll abcd

-rw-rw-r--.1 sst sst 0 Dec 12 21:49 abcd

二、权限管理:

wKiom1Z2dHjBHdB2AAA3hmRTjN4766.jpg

权限分三部分,分别对于属主(owner/user)、属组(group)和其它用户(other)而言的,而每一部分也分为3位,分别是读、写、执行。

上面画线的部分就是权限的表示。从左到右分别是属主、属组和其它用户的3位权限。

每一位表示权限的符号,要么为空,要么就是那个符号,不会变成别的。

r:readable, 读

w:writable, 写

x:excutable,执行

对于文件而言各种权限的效果:

r:可获取文件的数据;

w: 可修改文件的数据;

x:可将此文件运行为进程;

目录:

r:可使用ls命令获取其下的所有文件列表;

w: 可修改此目录下的文件列表;即创建或删除文件;

x: 可cd至此目录中,且可使用ls-l来获取所有文件的详细属性信

我们来看看下面这两个文件的。

wKiom1Z2dJqg6GU8AABLewFRll4958.jpg

第一个文件权限也就是属主可读写,属组可读,其它用户可读。第二个文件属主可读写执行,属组可读可写,其它用户可读可写。

因为这个权限只有两种状态,有或没有。所以可以用二进制1或0来表示。上面的权限用二进制排列也就成了:

第一个文件:11_1__1__

第二个文件:1111_11_1

而即然每一部分都是由3位组成,而且互不冲突。我们就可以更简洁的用8进制数来表示每一部分的权限。

r所在位置为4,w所在位置为2,x所在位置为1,我想只要知道二进制转换,这都不用解释。 权限也就可以这样表示了:

第一个文件:644

第二个文件:755

命令相关

1、chmod:修改文件权限

chmod[OPTION]... MODE[,MODE]... FILE...

chmod[OPTION]... OCTAL-MODE FILE...

chmod[OPTION]...--reference=RFILE FILE...

注意:用户仅能修改属主为自己的那些文件的权限;

常用选项:

-R 递归更改子目录和所有文件

(1) MODE表示法:

在第这一种用法中,每一部分所表示的来访者都有一个字母来表示:

a 代表所有用户,u 代表所有者,g 代表属组, o 代表其他用户。 可以直接用 + - = 来给文件添加权限(r,w,x)。

如: chmod g+w,o+wfile1 file2  为属组和其它用户在file1和file2 文件上添加 写权限。

例如:属组用户可读写,其它用户没有权限。我这里因为原来其它用户就只有r权限,所以就直接减去了。

[root@localhosthtml]# chmod g=rw,o-rindex.html

[root@localhosthtml]# ll

total0

-rw-rw----1 root root 0 Dec 12 23:58index.html

如果想让其它用户有读的权限就 o+r就可以了。

(2) 数字表示法(八进制表示法)

这里就用到我们上面说的八进制了。

如:

chmod 777file  属主,属组和其他用户都是读写执行权限,

chmod 755file  属主读写执行,属组和其它用户可读可执行。

例:

[root@localhosthtml]# chmod 644 index.html

[root@localhosthtml]# ll

total0

-rw-r--r--1 root root 0 Dec 12 23:58index.html

(3) 参照其它文件的权限

chmod[OPTION]... --reference=RFILE FILE...

这个也不用多做解释吧。直接上例子。

 [root@localhosthtml]# ll

total0

-rwxr-xr-x1 root root 0 Dec 13 00:29dex.html

-rw-r--r--1 root root 0 Dec 12 23:58index.html

例:以index.html做参考,修改dex.html的权限。

[root@localhosthtml]# chmod--reference=index.html dex.html

[root@localhosthtml]# ll

total0

-rw-r--r--1 root root 0 Dec 13 00:29dex.html

-rw-r--r--1 root root 0 Dec 12 23:58index.html

2、chown:文件属主属组修改。

chown[OPTION]... [OWNER][:[GROUP]] FILE...

chown[OPTION]... --reference=RFILE FILE...

注意:仅管理员可以修改文件的属主和属组;

常用选项:

-R 递归修改

使用:

如:把home和所有子目录和文件的属主和属组都改成sst.

chown -R sst:sst/home

只改某个文件的属主:

chownstarfile_name             

只改某个文件的属组:

chown :star file_name

中间的:冒号也可以改成.句号(英文标点)

而--reference跟chmod都是一样的使用方式。

3、chgrp:修改属组

chgrp[OPTION]... GROUP FILE...

chgrp[OPTION]... --reference=RFILE FILE...

常用选项:

-R 递归修改。

[root@localhosthtml]# chgrp testindex.html

[root@localhosthtml]# ll

[root@localhosthtml]# ll index.html

-rwxr-xr-x1 root test 117616 Dec 13 00:43index.html

4、umask: 显示和修改umask权限掩码

umask为文件的权限掩码,遮罩码;

创建文件时,所生成的文件权限是由默认最高权限减去权限掩码的权限得出来的。

一般文本文件默认最高权限是0666可读可写,文件默认是不可执行的。如果减得的结果中有执行权限,则需要将其加1;目录是0777可读可写可执行,不可执行的话将打不开目录。

umask:查看当前umask

umask MASK: 设置umask

例如:

[root@localhosthtml]# umask

0022

[root@localhosthtml]# umask 007

[root@localhosthtml]# umask

0007

第一位的0是一种特殊权限,此外不用管它。

注意:此类设定仅对当前shell进程有效,如想永久生效需要放到环境变量中,/etc/profile这个环境文件中有关于umask的设定。

我们来试试umask的作用。

[root@localhostabc]# umask

0007

[root@localhostabc]# touch a

[root@localhostabc]# ll a

-rw-rw----1 root root 0 Dec 13 01:30 a

666的权限去掉007,注意权限可没有负数之说。这只是一种形式,表示去掉其它用户的读写执行权限。以这个掩码创建的应该是660的文件。所以a文件才是属主属组可读写的权限。

那么我们再来改一下这个umask试试。

[root@localhostabc]# umask 035

[root@localhostabc]# umask

0035

现在这个情况666去掉035结果是631,但是这个结果中属组和其它用户中是有执行权限的,所以属组和其它用户会加1。结果是642。

[root@localhostabc]# touch b

[root@localhostabc]# ll b

-rw-r---w-1 root root 0 Dec 13 01:40 b

(我们这里权限有点诡计哈,其它用户可写却不可读,不过我们只是在做实验,实际环境可不会这么诡异。)

其实掩码的功能本来就是为了去掉某些权限,所以这样想的话上面的5就表示读和执行的权限。而去掉读和执行以后就只剩写了。

如果朋友们看着眼晕就只要记住有执行权限就加1就可以了。

额外命令:

id命令:显示用户的真和有效ID;

id[OPTION]... [USER]

-u: 仅显示有效的UID;

-g: 仅显示用户的基本组ID;

-G:仅显示用户所属的所有组的ID;

-n: 显示名字而非ID;

su命令:switch user

登录式切换:会通过读取目标用户的配置文件来重新初始化

su -USERNAME

su-l USERNAME

非登录式切换:不会读取目标用户的配置文件进行初始化

suUSERNAME

注意:管理员可无密码切换至其它任何用户;

常用选项:

-c 'COMMAND':仅以指定用户的身份运行此处指定的命令;

例:这里的 - 相当于以sst重新登录了,如果直接touchfile5,文件会创建到sst的家目录去。

[root@localhosttmp]# su - sst -c"touch /tmp/file5"

[root@localhosttmp]# ll file5

-rw-rw-r--1 sst sst 0 Dec 13 02:02 file5

这里还有一些重要的东西没有写,如:facl, selinux, SUID SGID SBIT, chattr之类的。

以后有机会再加入吧。

三、杂项

1、执行权限,如果没有执行权限,目录是打不开的。

2、对目录有写权限,对文件没有写权限的情况下,用vim可以强制覆盖,相当于是把原文件删除以后又建立了新的文件。(属主属组都会变成新的用户)

如果对原文件可读,VIM在读取文件的时候,数据就已经在内存中的。强制覆盖没有权限的原文件就是相当于拿这些数据新建了原文件。

但是用echo重定向是不可以的,因为它是直接对原文件的操作。

3、在目录只有执行权限的情况下,直接指定打开目录下文件的完整路径,也是可以打开的。

 

先就这样吧,没有什么深的东西,就是命令多了点,不过参数也就一部分常用到,其它的用到的时候man一下就可以了。

有什么问题,就尽管提出来,学无止境,我们可以共同学习。 一些错误的地方,如果发现还望朋友可以指导一下,一点点建议也是很大的帮助。谢谢了。

word复制上来的,排版有点差j_0016.gif

你可能感兴趣的:(Linux权限,linux用户)