用户管理是Linux系统管理非常重要的组成部分,怎样来管理用户,用户的管理我们简单的分为
(1)用户
(2)用户组
本章节会涉及到的一些配置文件:
(1)用户信息文件:/etc/passwd
(2)密码文件:/etc/shadow
(3)用户组文件:/etc/group
(4)用户组密码文件:/etc/gshadow
(5)用户配置文件:
*/etc/login.defs
*/etc/default/useradd
(6)新用户的信息文件:/etc/ske1,比如用户的环境变量等等
(7)登录成功后的提示信息:/etc/motd
我们要想学习Linux用户管理,首先要先掌握用户的信息,他们都是保存在哪个文件中,就像我们要学习windows的用户管理,我们就要知道windows密码信息保存在系统盘下的SAM文件中,那么在Linux下,这个文件实际上是放在/etc/shadow里面,我们首先要掌握的是,用户管理有两个非常重要的配置文件,一个是保存用户信息的文件,/etc/passwd,一个是保存用户密码的文件/etc/shadow,这是我们在学用户管理中,两个最基本的配置文件,
首先先看Linux下的用户信息文件/etc/passwd
我们可以使用more /etc/passwd查看一下这个文件的内容,在这个文件中,保存了系统中每一个用户的信息,我们看到,文件的内容很复杂,但是,记住,每一行代表了一个用户的信息,不管这个信息有多长,换句话说,/etc/passwd里有多少行,就证明这个系统中有多少个用户,每一行包含了7个组成信息,如果我们忘记了passwd的每行的组成信息,我们只要man 5 passwd看一下他的帮助信息就可以了,account:password:UID:GID:GECOS:directory:shell,就可以知道每个部分代表什么含义,所以我们只要查看一下这个文件中有多少行,就可以知道系统中有多少个用户了:
wc -l /etc/passwd 显示结果:38 /etc/passwd
我们针对root用户,特别地将/etc/passwd中的root信息拿出来:(用鼠标在SecureCRT中,选中要复制的内容,内容会自动进入剪贴板,到随便一处,点击鼠标,实现粘贴)
root:x:0:0:root:/root:/bin/bash,分析各个栏位信息
1、root,表示用户名:用户登录系统时使用的用户名,一般不用数字,而是只用字母,用户名最好不要太长,不要超过8位
2、x,表示密码位,不是存放密码,用一个x代替,我们称之为密码位,以后会详细介绍
3、0,表示UID,之前说过,Linux内核是不认识字母的,它只认识数字,也就是说系统操作的每一个对象:文件,进程,用户,用户组,都是要有一个数字标识,用户的表示叫UID
Linux用户分为三种:(1)、超级用户(root,UID=0)(2)、普通用户(UID 500-60000)(3)、伪用户(UID 1-499)
上面的所有ID并不是固定的,它们都是可以修改的,下面的介绍/etc/login.defs文件时,将会修改这几个的配置。
关于UID,这里有几点需要声明:
(1)超级用户有一个特点:UID=0,也就是说UID为0的就是超级用户,而并不是说用户名为root才是超级用户。此时我们可以使用vi /etc/passwd,找到普通用户,比如test,将其UID改为0,退出root用户,此时用test用户登录,我们发现shell提示符中出现了#号,也就是说此时的test权限是和root用户一摸一样的,我们可以使用grep test /etc/passwd找到我们修改的那一行:vae:x:0:500:vae123:/home/vae:/bin/bash。所以要注意,在Linux中,只要用户的UID为0,他的权限跟root是一摸一样的,同样我们对系统中进行的设置,限定,对超级用户是不生效的,由于root用户的权限太大了,很容易造成一些误操作,那么我们在真正管理系统的时候,当系统已经部署好以后,我们尽量授权一个普通用户账号,让它可以协助你完成平时的日常管理就可以了,除非万不得已要使用root账号来进行修复或操作,我们才却换到root账户。
(2)普通用户,我们自己手工可以添加的,UID是500-60000,在没有指定的情况下,建立一个普通用户,UID就会从500开始,最大是60000,当然这个数字也是可以修改的
(3)伪用户(系统安装和服务应用的时候,自动生成的用户,只是进程或服务启动时候,调用的一个用户身份)
伪用户有两种,
一种是与系统操作相关的(Linux中,每一个操作,比如关机,查看命令,修改配置等等,都要有一个用户身份),比如bin、daemon、shutdown
一种是与程序服务相关的(比如我们在安装一个Apache服务器,我们在Linux下操作Apache的时候,必须要有一个用户来对应它,就相当于该程序的主人,我们此时不可能用root身份来对应它,因为一旦通过一些程序得到这个Apache进程的权限,就等同于得到了root的权限,那就相当可怕了,此时我们就可以通过添加一些服务相对应的伪用户,比如apache,mysql,sshd,ftp等等用户,实际上是这个进程启动的时候,所调用的用户身份),所以伪用户的作用就是在系统操作和服务启动所调用的用户身份而已,伪用户是没有办法登录系统的,它并没有设定密码,同时也没有宿主目录,所以即便你获取了伪用户的,也没有办法登录Linux来进行操作,它让我们的系统和服务起到一定的安全性,所以在系统安装的时候,默认就会有这些伪用户,是系统自动生成的,甚至在系统安装的时候,有些服务需要生成一个新的伪用户的话,系统会自动在你的用户配置文件里面,添加对应的一个伪用户信息。
4、0,表示GID(组ID),指的的是用户的缺省组的标识号
首先要明白一个概念,在Linux用户管理中,我们要分成两个部分来学,一个是用户,一个是用户组,注意:用户组,是同样类型用户的集合。在系统中,一个用户组可以有多个用户,反过来讲,一个用户也可以属于多个用户组,比如系统有一个web server管理的组,一个ftp server管理的组,有一个用户zhangsan,我可以让它即管理web server,又管理ftp server,我让他同时属于这两个组,这是可以的。但是它总是要有一个缺省的组,也就是/etc/passwd文件下的GID(缺省组ID),即便你在添加用户的时候,没有给该用户分配一个组,系统也会帮你分配一个缺省的组(我们称之为初始组),换句话说,添加一个用户,这个用户必须有一个隶属的组,有些系统会将该用户添加一个和用户名同名的组,有的会分配一个组。*所以,记住一个概念,在Linux中,添加一个用户,该用户就要会有一个属于自己的组,因为你添加一个用户一定是有目的的,这个用户添加后,是要让他来做什么事情呢,如果没为他添加组,那么至少该用户要有属于自己的部门,是属于项目1组,还是项目2组等等,用户总要归一个类,否则你的系统就都是散散的用户,只能证明你这个管理员很失败。
用户组总结:
每一个用户都至少属于一个用户组,也就是一个用户可以属于多个组
每一个用户组可以包括多个用户
同一个用户组的用户享有该组共有的权限,这就是我们为什么将该用户加或不加入这个组的原因
5、root,表示注释性描述,也就是该用户的描述信息,可有可没有,比如root:x:0:0:root:/root:/bin/bash这个管理员中,我们可以在这个描述中root,superuser,administrator等等都可以,可以有也可以没有,所以我们看到有些用户这个位置是空的,只是两个冒号来分隔test:x:500:500::/home/vae:/bin/bash普通用户,建议我们在添加用户的时候,添加一个注释性的描述,这样如果我们用户非常多,就可以知道他的真实身份,该分配什么权限给他了。
6、/root,表示宿主目录,每一个用户都必须要有自己的宿主目录,用来存放自己的基本信息,上节课我们讲过:
那么vi的配置文件存放在什么位置呢?存放在每个用户的宿主目录下,每个用户的宿主目录用“~”波浪线表示,可以使用cd进入,home directory,在Linux中,每个用户都需要有一个宿主目录,也就是每个用户登录过来后,都需要有一个存储管理自己东西的位置,如果这个用户没有宿主目录(home directory家目录),很多Linux和UNX是不允许该用户登录的(因为用户登录成功后,默认是进入到自己的家目录),所以在Linux里,添加一个用户,缺省就会给该用户创建一个宿主目录,这个数组目录理论上可以任意指定,但是如果你没有为该用户指定宿主目录的位置,系统默认就会在该用户的/home下面(每个用户都在home目录下有自己的信息目录,该目录就是该用户的宿主目录),创建一个跟这个用户同名的目录。
7、/bin/bash,表示命令解释器,表示用户使用的shell,缺省为bash,表示用户登录后所拥有的权限,用户可以有正常的bash命令,此处可以将其改为某个命令(命令的绝对路径),表示用户登录后,只能执行该命令,在Linux中,命令解释器有很多个,一般使用的是bash,我们操作命令的时候,都是通过shell传递给内核,得到这个命令操作的结果,返回给我们(即进行ascii码和机器码的相互转换)。注意,如果shell命令解释器写错,该用户就没有办法登录了,就像伪用户都是/sbin/nologin(表示不能登录的,因为他没有这个命令解释器,没有办法将操作的命令传递给内核,以后我们可以不用直接删除用户,而是只要将他的bash改为/sbin/nologin即可)
以上是Linux中/etc/passwd配置文件中,保存用户信息的7个组成部分,每一行就是一个用户的信息,每一行都有这7个组成部分
那么为什么/etc/passwd文件中,没有存放密码呢
使用 ls -l /etc/passwd查看该文件的权限,我们发现每个用户都对他有r读的权限
-rw-r--r--. 1 root root 1834 5鏈?24 09:34 /etc/passwd,那么我们就有这个问题,假设所有用户的密码都存放在这个文件中,任何人都可以拿到密码,去尝试破解密码,这就很危险了。那密码被转移到哪个文件中呢,下面介绍/etc/shadow文件
在/etc/shadow中,保存了真正的用户密码,more /etc/shadow,我们可以使用man帮助命令来查看该文件的帮助文档(非常重要,要学会查看帮助文档)
我们可以在帮助文档中看到,/etc/shadow中的组成部分:
The meanings of each field are:
路 sp_namp - pointer to null-terminated user name
路 sp_pwdp - pointer to null-terminated password
路 sp_lstchg - days since Jan 1, 1970 password was last changed
路 sp_min - days before which password may not be changed
路 sp_max - days after which password must be changed
路 sp_warn - days before password is to expire that user is warned of
pending password expiration
路 sp_inact - days after password expires that account is considered
inactive and disabled
路 sp_expire - days since Jan 1, 1970 when account will be disabled
路 sp_flag - reserved for future use
查看root用户在/etc/shadow配置文件下的信息:
root:$6$8EirqH7JghPv0./e$AEiXGYMLFWP4XccXouj0nZ1SbGySf2bdnSxpnBLeDCxok2nQcX5gzIw
9nunyZvc0GQCJ5waDY26tqRId7AGmL.:15480:0:99999:7:::
各个栏位依次表示:用户名,密文,最后一次修改时间,最小时间间隔,最大时间间隔,警告时间,用户闲置时间,失效时间,标志
我们可以ls -l /etc/shadow
-r-------- 1 root root 1114 09-06 12:58 /etc/shadow/etc/shado发现只有root才有读权限,但是,root用户谁也阻挡不了它,什么权限都有,即便我们都使用root来修改这个文件的内容,虽然他会提示(readonly)只读文件,但是root是可以的,我们使用":wq!"强制保存退出。
(2)密文的实验,下面,我们可以使用一个普通用户test做个实验,我们把test用户对应的密文栏位删除(两个冒号之间什么都没有),然后再使用test用户名登录,发现此时不需要密码就可以登录了(而不是不允许登录),所以我们以后在忘记密码的时候,就可以使用root将/etc/shadow对应的用户密文删除,再passwd vae,给他添加一个密文就可以了
(3)最后一次修改密码的时间,以天为单位1834,1834天,是以1970年1月1日作为参考点的
(4)最小时间间隔:也就是限定我们两次修改密码的时间间隔,这个用的很少,一般这个数字为0,表示不限定,任何时候都可以修改密码,以天为单位
(5)最大时间间隔:用在强制性让用户变更密码,也就是提示用户在多少天内一定要修改密码,不然过了这个天数,这个用户就不能再使用了(默认是99999),也就是不限定,也就是密码的有效期(密码的第三个原则:实效性)
(6)警告时间:默认值是7天,也就是剩下7天后,就会自动警告用户,再不修改密码,账号就会失效,这个是配合上面最大时间间隔一起使用的,最后这个两个选项用得比较少
(7)用户闲置时间:用户多长时间没有登录了,就可以通过这个时间来判断
(8)失效时间:表示这个账号失效多久了,空表示这个账号从来没有失效过,比如一个账号被我们锁定了
(以上几个时间都是可以修改的,我们可以在/etc/login.defs修改这几个时间的配置)
(9)标志:一般都不使用
此时我们可以使用grep root /etc/passwd /etc/shadow,来查看这两个文件中root信息,
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/shadow:root:$6$8EirqH7JghPv0./e$AEiXGYMLFWP4XccXouj0nZ1SbGySf2bdnSxpnBLeDCxok2nQcX5gzIw9nunyZvc0GQCJ5waDY26tqRId7AGmL.:15480:0:99999:7:::
其中/etc/passwd是用来保存用户信息的,/etc/shadow是用来保存用户密码的,那为什么/etc/passwd中的密码位不去掉呢?其实,不管是添加用户中设置密码,还是在修改密码,他都是先将密码保存在/etc/passwd中,然后再转移到/etc/shadow中。我们可以使用命令:"pwunconv"(这里又是一个新的命令),将“当前用户”密码返回去,此时我们在grep root /etc/passwd /etc/shadow,发现passwd中有密码,而shadow中root不存在了。其实系统在转移密码的时候,自动使用了"pwconv"命令,将密码转移到/etc/shadow文件中,只是这个命令不是我们来执行的(此时键入pwconv,将passwd密码手动转移到shadow中),solaris修改是不提供"pwunconv"命令的,也就是商业版的Unix都是不提供"pwunconv"的,基于安全性的考虑。
此时,我们可以不是用useradd命令来添加用户,而是通过修改/etc/passwd和/etc/shadow文件来添加用户:
vi /etc/passwd在末尾添加一行用户名为lin,密码为空,用户描述为shaowei,宿主目录/home/lin,shell:bin/bash
vi /etc/shadow G到达末尾,用yy复制一行,小写p在该行下面黏贴,将密码设为空
mkdir -p(parent必要时建立父目录) /home/lin为用户lin建立宿主目录
此时是在用户界面上是用ctrl+alt+shift+f1,f2等却换到命令行下,使用lin登录,就可以实现登录了。
所以这是和学习windows不一样的地方,windows很多都是表层应用上的操作,而Linux我们可以修改它的配置文件,甚至可以脱离命令的使用
Linux验证用户是这样的:
我们在输入用户名:此时就会在/etc/passwd中验证这个用户名,
我们输入密码:此时就会在/etc/shadow中验证这个密码
但是我们还发现一个问题,就是我们使用lin登录后,发现shell命令提示符不一样的,这是怎么样回事,其实我们这个过程只是很简单的添加一个用户,该用户到很多环境变量都没有给他设置。那这个怎么弄呢?这里面我们还有一个要掌握的内容,系统中还有一个目录(注意:这是一个目录)
/etc/skel,所有新用户信息文件都放在这个目录下面
此时我们使用ls /etc/skel查看该目录下面的东西,我们发现里面什么都没有,实际上,里面都是一些隐藏文件,我们可以使用
ls -a /etc/skel 查看所有文件
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla
这里面定义了用户登录的一些设置文件,都是放在这个目录下的
我们此时使用useradd mary创建一个用户,ls -a /home/mary查看mary的宿主目录下的东西,发现都是这个/etc/skel下的东西,所以也就是说,如果我们是要使用刚刚上面修改配置文件来添加用户的话,那么同时就需要将/etc/skel目录下的东西copy到该用户的宿主目录中,为该用户设置他的一些相关的环境变量,此时进入到skel目录中,
使用:cp -rf .*(.表示隐藏文件,因为该目录里面存放的都是隐藏文件,*表示匹配所有字符) /home/lin(目标目录) (
-r表示拷贝目录,-f表示如果文件无法打开,还是强制性的移动),此处复制后会出现一点错误,由于我们使用.*匹配,他会把..上一级目录的所有文件都复制过去,所以我们还是手工的一个一个的复制过去
再使用lin登录,发现这个shell提示符已经一样了,但是他会提示你说501组ID不存在,其实这是我们在添加用户的时候,只要将它存放到某一个现有的组就行了
以上是怎样来手工添加一个用户
掌握
用户的基本信息存放在/etc/passwd7个组成部分
/etc/shadow前两个组成部分
为何密码位不存放密码,密码是如何转移的,pwconv(从/etc/passwd到/etc/shadow),pwunconv(从/etc/shadow到/etc/passwd)
用户登录时,用户名使用哪个文件来验证,密码使用哪个文件来验证
怎样手工添加一个用户
新用户的信息目录:/etc/skel,里面存放的都是隐藏文件,如何查看隐藏文件,还有如何将该目录的所有隐藏文件cp到宿主目录中,copy后有什么用
其实系统每次在执行useradd的时候,在给新用户创建宿主目录时,就会自动将这个目录下的文件copy过去
还有两个用户配置文件(新添加用户时,用户默认的设置都存在这两个文件中,就是/etc/passwd和/etc/shadow中每一个用户的默认配置信息,如果你想改变添加用户时,用户的配置,就可以改变这个两个文件的配置)需要掌握:
再继续介绍相关的配置文件:
(1)/etc/login.defs 使用vi /ect/login.defs查看文件的内容
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
这个几个值都是在/etc/shadow中存在的,我们可以通过修改这个文件中的默认值,去修改每个用户的密码设置
(2)/etc/default/useradd vi /etc/default/useradd
(注意:每添加一个用户,就要事先想好这个用户要放在哪个组,或者清楚这个用户是用来干嘛的,不应该存在一个不知道该让他来干嘛的用户)
GROUP=100
HOME=/home 新添加的用户的宿主目录是可以更改的
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel 新用户的信息(环境变量)是可以更改的
CREATE_MAIL_SPOOL=yes
其中,SHELL表示这个用户的shell使用哪一种,即用户登录后能给他拥有什么权限,/bin/bash就表示用户可以正常的使用bash命令,我们可以cat /etc/shells查看系统中存在的shell,
/bin/sh 在老一点的Unix系统中,比如solaris修改,缺省的都是/bin/sh
/bin/bash 在Linux里,基本都是bash
/sbin/nologin 也是一种shell,伪用户用到的shell,如果你想让某一个用户不能登录系统,那你将它的shell改为/sbin/nologin就行了,在/etc/passwd文件中的命令解释器中改
/bin/tcsh 这是shell编程使用到的,系统操作的时候,我们用系统默认的bash就可以了
/bin/csh
(3)登录信息/etc/motd 全拼是:message of the day (表示今日消息)
还有一个文件/etc/issue也是登录信息文件
我们有一个cat /etc/issue,这个文件存放的是我们每次启动系统时候的提示信息,(现在很多远程登录的软件都屏蔽了这些信息,但我们在Linux命令行模式下登录用户时还是可以看到的)系统版本号,这段信息就是来自/etc/issue这个文件,系统在启动的时候,会自动提取内核的版本,硬件平台。这个信息文件也是可以被更改的,但是注意,我们在更改的时候,最好是做一个文件的备份,cp /etc/issue /etc/issue.bak.20120122,最好写上时间,出于安全的考虑,我们最好是将这个/etc/issue的内容更改了,因为在网上可以找到相应版本号的漏洞
而/etc/motd是什么呢,只能是你登录成功了,才会有的提示信息,如果你瞎尝试的登录,猜我的密码,你是看不到的motd的信息的。而/etc/issue他是只要你尝试登录系统 ,就会提示的信息
我们可以编辑/etc/motd的内容:
ftp.lamp.net
此时在命令行下登录成功就会提示这个信息了,一般用于提示给我们系统的用户,登录成功后才给的信息。
介绍一个技巧:
手工给tom用户设置密码,stdin表示使用加密算法:echo 123456 | passwd --stdin tom
小总结:
/etc/skel 都是隐藏文件,存放用户的环境变量等,使用useradd时,系统会自动将该目录下的所有文件复制到用户的宿主目录中,手工则需手动复制
/etc/shells 存放系统中所有的shell
/etc/login.defs 存放/etc/shadow各个选项的默认值,此处可以修改
/etc/default/useradd 存放/etc/passwd各个选项的默认值,此处也可以修改,修改后以后添加用户时,就会有相应的信息改变了
/etc/motd 用户登录成功后,提示信息
/etc/issue 系统的发行版本号,远程客户端一般都把他屏蔽掉了
备份技巧:
cp /etc/issue /etc/issue.bak.20120907
使用“.bak.时间”来命名备份文件,可以清楚的看到是什么时候做的备份。
以上介绍了Linux用户管理的相关配置文件,下一章节将会介绍Linux用户管理中,如何将用户归并到一个用户组中,以及如何给用户授权,敬请期待