6_linux用户及权限(1)
------------
用户管理:
useradd,userdel,usermod,passwd,chsh,chfn,finger,id,chage
组管理:
groupadd,groupdel,groupmod,gpasswd
权限管理:
chown,chgrp,chmod,umask
------------
如果一个进程在编译的时候使用了共享库,这就意味着这个进程在启动之前必须要把它所依赖的库装到内存中去,所以这个进程真正想运行起来事实上在它的外部,在我们的内存空间中启动了有各个库,这些库在内存当中,但它不是独立执行的,它是被程序调用后才执行。如果我们又启动另外一个进程,如果这个程序依赖于跟第一个文件一样的库文件,那么这个库已经在内存中了,它不再需要重新装入内存。因为这个库不是独立运行了,而且他已经在内存中了,这就意味着每一个进程在调用它的时候都是在自己的地址里面调用这个功能的,谁调用谁去拿一个副本,所以这个库被称作共享库。库其实跟进程是平行的概念,它没有上下关系,只是被依赖关系,它们都直接由内核进程来操作,这是站在运行的视角上来看的。
我们系统上许许多多的文件,这些文件或者我们的某些计算能力都可以理解为资源,称为计算资源。资源是有限的,那是不是所有人都可以拿来使用这台计算机的资源,很显然它的确是这样的,但计算机肯定不愿意被人随意访问,如果我们的计算机中有机密文件和资料,那别人都可以随意访问,我们的机密性将无从得到保证。我们设定下,这些资源或服务仅能被哪些人访问,定义了资源或服务的访问能力,这叫做权限,但我们在使用计算机的资源或服务的时候,某些时候我们仅想定义某一个特定的人怎么去访问某个资源,或者说它具有什么样的访问资源的能力,第二个是我们定义一类用户,它们是否具有访问某个资源或服务的能力。如果我们定义单个用户的话,很容易理解模型,如果我们定义某一类的用户话,比如我们有一百个同学,这一百个同学我期望他们都有权限访问某个文件,那我们是不是就把这个文件赋予这一百个同学都得去访问,我们需要一个个指定同学的访问权限吗?不用,我们可以建一个逻辑容器,这个容器它不是用户也不是特定的资源使用者,它只是个容器,这个容器可以理解为用户的容器,它里面可以放用户,同时这个容器上还可以关联权限,那么只要某个用户放到这个容器里,它就自动的具有了这个容器上所关联的权限,那么这个容器就叫做组,或者用户组。说白了,组就是权限的容器或者叫权限的集合,这个集合可以附加到某个用户上,从而让用户具有这个容器的权限,所以组是个逻辑概念,它本身并不能直接使用,它只是能够方便的指派权限的。
用户说白了就是获取资源或者服务的凭证
计算资源
权限
用户
用户,容器,关联权限:用户组,方便地指派权限
用户:标识符
用户组:标识符
文件:我们在定义某一个文件的时候,我们定义这个文件为某一个标识符所有。如果某个用户来试图访问计算资源的时候,他被机器映射为某个标识符。
所有对计算机的操作,不管是双击一个程序或者敲命令行,这个过程的结果就是发起一个进程,实际上,看似是用户在操作计算机,事实上是进程,整个操作过程是由进程代为完成的,你只是定义了我要执行某个程序。
进程也是有属主和属组的,谁发起了这个进程,那么这个进程就以谁的身份去运行。
进程到底能够访问哪些文件,取决于进程自己的权限和他访问的资源的权限,这个过程的判断是由我们系统资源的安全管理属性自动完成的(内核的管理下)
安全上下文(secure context)
之前说过,在linux上,每一个文件都有三类权限定义,其中每三位为一组,自左而右,分别是属主的权限,然后是数组的权限,最后是其他权限
[root@localhost ~]# ls -l
总用量 8
-rw-------. 1 root root 1626 7月 30 05:52 anaconda-ks.cfg
-rw-r--r--. 1 root root 1855 7月 30 05:57 initial-setup-ks.cfg
权限:
r、w、x
文件:
r:可读。可以使用类似cat等命令查看文件内容
w:可写,可以编辑或删除此文件
x(eXacutable):可执行,可以命令提示符下当做命令提交给内核运行
目录:
r:可以对此目录执行ls以列出内部所有的文件
w:可以在此目录创建文件
x:可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息
rwx:
r--:只读
r-x:读和执行
---:无权限
---我们可以用000来表示,因为每一位只有一种变化,这是在二进制里
000,---:无权限
001,--x:执行
010,-w-:写
011,-wx:写和执行
100,r--:只读
101,r-x:读和执行
110,rw-:读写
111,rwx:读写执行
我们换成八进制来看:
0 000,---:无权限
1 001,--x:执行
2 010,-w-:写
3 011,-wx:写和执行
4 100,r--:只读
5 101,r-x:读和执行
6 110,rw-:读写
7 111,rwx:读写执行
那么我们使用一个八进制就可以表示某一类用户的权限了
755:rwxr-xr-x
rw-r-----:640
用户:UID
组:GID
解析:名称解析,www.xxx.com-->IP
计算机如何将用户名转换为ID号,是一定有一个数据库的,就是/etc/passwd。组的数据库是/etc/group
用户:UID,/etc/passwd
组:GID,/etc/group
为了便于用户管理,我们系统所给用户提供的食属性可能不仅仅是用户的ID号,比如,任何一个用户一登录系统,就会给用户打开一个shell,这个shell有命令提示符用户才能跟计算机交互,就是所谓的登录,那么这个shell是什么bsh?zsh?还是什么,如果用户没指定,那么就会给一个默认的,每一个用户的默认shell等等也都在/etc/passwd里定义的。这里是用户的信息库
是不是
影子口令:/etc/shadow //事实上它把用户的密码放在了/etc/shadow,但是在/etc/passwd里照样有一个位,这个位就是密码,只不过这个密码位打了个X,告诉你密码不在此处,请另找其他文件
用户:/etc/shadow
组:/etc/gshadow //可能会很奇怪,组是从来不需要登录系统的,他不是获取资源的组合,只是个容器而已,那么组要密码干嘛
用户类别:
管理员:0 //管理员的ID号为0的,这是内部生成的,内部法则。
普通用户:1-65535 //16位2进制来区别每一个用户。在有些红帽企业级系统上它们使用32位二进制来标识每一个用户(超过65535来说)
系统用户:1-499
一般用户:500-60000
很多位于后台运行的不需要跟用户关联的进程,专门拿来运行后台进程的用户叫做系统用户,这一类用户应该限定不允许登录系统
用户组:
管理员组:
普通组:
系统组:
一般组:
组是用户的容器,那么也意味着一个用户可以属于多个组,那它自己创建的文件的属组应该是哪个组?在这个角度来说
用户组类别:
私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户名同名的组。
基本组(也叫私有组):用户默认组。
附加组,额外组:默认组以外的其他组
注意,基本组未必是私有组,每一个用户都有一个组是它的默认组,也称基本组,是这个意思。所以这个用户创建的文件,这个文件的属主一定是用户自身,而属组是它的默认组或基本组。但是我们在创建一个用户的时候,压根没有为这个用户指定任何一个组,那怎么办,很多时候我们可以加一个用户,这个用户也没必要属于一个组,那就意味着它没有默认组,没默认组就意味着它创建文件的属组无从定义,那么这个时候怎么办?所以为了避免出现这种窘况,一般创建一个用户的时候没有为其指定组,那么创建用户的同时会给它同时创建一个仅包含了这个用户而且跟用户同名的组。叫用户的私有组。
/etc/passwd:
使用 whatis passwd 可以查看passwd有几个章节的man文档
[root@localhost ~]# whatis passwd
passwd (5) - (未知的主题)
sslpasswd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
[root@localhost ~]#
第五个章节是对配置文件格式的说明
[root@localhost ~]# man 5 passwd
account:登录名
password:密码
UID:用户的ID号
GID:基本组ID
comment:用户的注释信息
HOME DIR:家目录
SHELL:用户默认shell ///sbin/nologin-->后面显示这种就是系统用户不能登录或非法shell也不能登录
在当前系统下,/etc/shells里面保存合法shell
/etc/shadow:
[root@localhost ~]# man 5 shadow
account:登录名
encrypted passwd:加密的密码
记住更换密码的时间
密码最少使用期限
密码最长使用期限
密码离过期还有多少天
密码被禁用之前宽限的时间
明确定义此用户到什么时候结束
保留字段,没有意义
root:$6$f4NqgNlgtCvX73us$VaDKZLi6JDUuG/T5/lgdqg2ofS5G6DOgqLxK.CxjovWyqCws8BU5mUSaMAEupBKyQV9PU186clbOeX9OLZo/V.::0:99999:7:::
$加密手法$杂质$密文
1 | MD5
2a | Blowfish (not in mainline glibc; added in some Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
bin:*:17632:0:99999:7:::
*是不可登录的
加密方法:
对称加密:加密和解密使用同一个密码
公钥加密:每个密码都成对出现,一个为私钥(secret Key),一个为公钥(public Key)。公钥加密只能用于已知配对的私钥解密,反之亦然。
公钥加密比对称加密的秘钥要长得多,安全性要长得多,同时速度也慢得多。一般情况下,对称加密的速度比公钥加密的速度要快上三个数量级(1000倍以上),公钥加密很少用来加密数据,太慢了,它用于做秘钥交换
单向加密:也称散列加密:提取数据特征码(也称指纹加密,非可逆的)。单向加密用于做数据校验。
单向加密只能由数据取得其加密后的密文,加密之前叫明文,加密之后叫密文单向加密可以由明文取得密文,反之不成。
单向加密的特性:
1、雪崩效应:初始条件的微小改变,将会引起结果的巨大变化。(防逆向工程)
2、定长输出
MD5:Message Digest,128位定长输出(麻省理工学院人工智能实验室研发的)
SHA1:Secure Hash Algorithm,160位定长输出(美国国家标准委员会召集出来的一种通用算法)
...
如何添加一个用户
useradd(adduser):useradd USERNAME
root@localhost ~]# ls -l `which adduser`
lrwxrwxrwx. 1 root root 7 7月 30 05:30 /usr/sbin/adduser -> useradd //软连接,adduser事实上就是useradd
[root@localhost ~]#
命令替换
[root@localhost ~]# which useradd
/usr/sbin/useradd
[root@localhost ~]# ls -l useradd
ls: 无法访问useradd: 没有那个文件或目录
[root@localhost ~]# ls -l $(which useradd) //命令替换
-rwxr-x---. 1 root root 118192 11月 6 2016 /usr/sbin/useradd
[root@localhost ~]# ls -l `which useradd` //反引号也是可以的
-rwxr-x---. 1 root root 118192 11月 6 2016 /usr/sbin/useradd
[root@localhost ~]#
管理员可以passwd加用户名 改它的密码
[root@localhost ~]# useradd Tom //添加用户
[root@localhost ~]# passwd Tom //设置密码
更改用户 Tom 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# tail -l /etc/shadow //查看一下shadow
ntp:!!:17741::::::
sssd:!!:17741::::::
gdm:!!:17741::::::
gnome-initial-setup:!!:17741::::::
sshd:!!:17741::::::
avahi:!!:17741::::::
postfix:!!:17741::::::
tcpdump:!!:17741::::::
yanhan:$6$ANrwMNKtD3wT7kTK$8G3OsYuSvADKu3lWdk065vOnc4J.xYoZNSpRK2wxv.ny6NKuZb9dtcQLu1UFoBY1CMOcMx2Ij5kP29d47dMvP0::0:99999:7:::
Tom:$6$F3oxqv8q$aCgkHtQyMpwNHFOZk6U.RwyAnTbWwAeVq48qn8dl5PiyFR9kP3PhE92dOYcYuP9Ozm3b2cneWJqvM/ZeKCldi.:17850:0:99999:7::: //TOM和我的密码是相同的,首先看这里 $6$ 这是hash加密,root的杂质:$ANrwMNKtD3wT7kTK$。TOM的杂质:$F3oxqv8q$。即使密码相同但是杂质是随机,所以一般来说密文不会相同
[root@localhost ~]#
[root@localhost ~]# tail -1 /etc/passwd
Tom:x:1001:1001::/home/Tom:/bin/bash //已经自动归好组了
[root@localhost ~]# tail -1 /etc/group
Tom:x:1001: //名字叫Tom的组,1001
[root@localhost ~]#
useradd为什么能指定默认属性?在etc下有一个default目录
[root@localhost ~]# cd /etc/default/
[root@localhost default]# ls
grub nss useradd
[root@localhost default]# file useradd //看文件类型
useradd: ASCII text
[root@localhost default]# cat useradd //查看内容
# useradd defaults file
GROUP=100
HOME=/home //说明没有给用户指定家目录,就在/home给用户创建一个同名的作为家目录
INACTIVE=-1 //非活动期限有多长,-1不做限定
EXPIRE= //过期期限
SHELL=/bin/bash //默认shell
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@localhost default]#
组的文件格式
[root@localhost default]# cat /etc/group
root:x:0:
[root@localhost default]#
组名:密码占位符:组ID:以这个组为附加组的用户列表
手动添加一个组
groupadd GRPNAME
[root@localhost default]# cd
[root@localhost ~]# groupadd mygroup
[root@localhost ~]# tail -1 /etc/group
mygroup:x:1002:
[root@localhost ~]#