linux安全系统的核心是用户账户,每个使用者使用一个账户名及与该账户关联的密码登入linux系统。使用者对系统资源的访问权限取决于其登录时所用的账户。
每个账户在创建时会被分配一个惟一的标识UID,用户权限便是根据UID来跟踪的。每个账户可以选择加入某些个群组以方便统一管理,每个群组也对应一个惟一标识GID。所有账户名、UID、GID等信息都保存于/etc/passwd文件中,所有群组信息都保存于/etc/group文件中,而账户密码则以加密方式保存于/etc/shadow中。
一、/etc/{passwd,shadow,group}解析
1、/etc/passwd
该文件存放着与所有用户相关的信息,每行包含7个字段,其格式为:
用户名:密码占位符:UID:基本组GID:注释信息:家目录:shell
例 wittgenstein:x:500:500:wittgenstein:/home/wittgenstein:/bin/bash
1)第二字段是以x表示的密码占位符,因/etc/passwd默认是对所有用户开放读权限的,为安全起见,实际密码是存放于只有管理员能访问的/etc/shadow文件中的。
[root@localhost ~]# ls -l /etc/{passwd,shadow} -rw-r--r-- 1 root root 1594 Oct 5 13:00 /etc/passwd ---------- 1 root root 1032 Oct 5 13:00 /etc/shadow
2)系统账户默认的shell为/sbin/nologin,这是一个无法登入主机的特殊shell,系统用户不需也不宜取得shell交互环境。其它用户默认为/bin/bash
2、/etc/shadow
该文件以加密的方式存放着各用户的密码,每行9个字段,其格式为:
用户名:加密的密码:最近一次修改密码的时间:密码最短使用期限:密码最长使用期限:密码过期警告区间:非活动期限:账号过期期限:保留字段
例 wittgenstein:$6$dHcMR77ZSJgbb...:16652:0:99999:7:::
1)密码是以加密方式存放的,还未创建密码的新用户该字段用!!表示
2)密码最短使用期限,意即在此期限内密码不可更改。如果是0,则表示可随时改动
3)密码最长使用期限,意即在此期限内密码必须更改,逾期密码会变成过期属性
3)密码过期警告区间,意即密码过期后的宽限时间
3、/etc/group
该文件存放着与群组相关的信息,每行4个字段,其格式为:
群组名:群组密码占位符:GID:群组支持的用户名
例 wittgenstein:x:500:davinci,tesla
1)群组密码实际存放于/etc/gshadow中,通常不需设定
2)最后一个字段实质上是以该群组为附加组的用户列表,以该群组为基本组的用户名不会自动被添加到此处。
将用户加入群组的方法:
a.在使用useradd或usermod命令时,指定-g或-G选项将其加入某个群组
b.直接编辑/etc/group文件,在目标群组行的末尾添加用户名,用户名之间以逗号相隔
二、用户管理
1、用户分类
linux用户由一个管理员账户(root)以及若干系统用户和普通用户组成。通常,三类用户被分配的UID是:root为0,系统用户为(1-499),普通用户为500+。root用户的家目录为/root,普通用户的家目录默认为/home/username,系统用户默认不会主动建立家目录.
root用户拥有几乎一切权限,能够操作各种系统资源及控制其它用户的创建、删除、权限等。为安全起见,linux服务器上每个在后台运行的服务都对应一个系统账户,这样即使攻击者攻破某个服务,也无法访问整个系统。
2、useradd:创建用户
用法:useradd [-u UID] [-g 基本组GID/群组名] [-G 附加组GID/群组名]... username
其它常用选项:
-c:加上注释,注释会保存于/etc/passwd文件的注释段中
-d:指定家目录,若指定目录已存在,会有警告信息
-s SHELL:指定shell,必须是/etc/shells中存在的shell,默认为/bin/bash
-m:自动建立用户家目录(默认)
-M:不给用户创建家目录
-e:指定用户的过期日期,格式为YYYY-MM-DD,此设定值会被写入shadow文件第8段
-f:指定账户过期几天后永久停权,设定值为0表示立即停权,为-1则表示关闭此功能,默认为-1。设定值会被写入shadow文件第7段
可指定多个附加组,以逗号相隔
使用示例:useradd -u 505 -g wittgenstein -G 502,davinci tesla
注意:在useradd中指定群组时不能指定当前并不存在的群组;每个用户必对应一个基本组(但一个群组可作为多个用户的基本组),无论是随用户一起创建还是指定的,但用户可以选择是否加入或加入哪些附加组。
当我们不指定任何选项,以预设方式useradd username创建用户时:
1)该用户的UID为当前最大UID加1,并且会创建一个群组名与用户名相同的基本组,其GID默认与UID相同,但若该GID已存在,则会在当前最大GID基础上加1
2)在/etc/passwd里会新建一行与该用户相关的信息,包括用户名、UID、GID、shell等
3)在/etc/shadow里会新建一行与该用户密码相关的参数,此时还没有密码,需要使用passwd命令创建密码后才会生成
4)在/etc/group里会新建一行群组名同用户名的群组信息(若创建用户时指定其基本组为已存在的群组,则不会新建)
5)在/home下面会建立一个名为username且权限为700的家目录,即只有该用户自己与管理员能够进入该目录。
[root@localhost ~]# useradd tesla [root@localhost ~]# tail -2 /etc/passwd wittgenstein:x:500:500:wittgenstein:/home/wittgenstein:/bin/bash tesla:x:501:501::/home/tesla:/bin/bash [root@localhost ~]# groupadd sience [root@localhost ~]# groupadd -g 505 movie [root@localhost ~]# tail -3 /etc/group tesla:x:501: sience:x:502: movie:x:505: [root@localhost ~]# useradd -c super davinci [root@localhost ~]# tail -2 /etc/passwd tesla:x:501:501::/home/tesla:/bin/bash davinci:x:502:506:super:/home/davinci:/bin/bash [root@localhost ~]# useradd -u 503 -G movie kubrick [root@localhost ~]# id kubrick uid=503(kubrick) gid=503(kubrick) groups=503(kubrick),505(movie)
3、passwd:创建或修改密码
用法:passwd [option]... [username]
常用选项:
-d:删除密码
-l:lock,锁住密码,只有root用户能执行
-u:unlock,解锁密码,只有root用户能执行
--stdin:以管道前的数据作为密码输入,这样就不用交互式进行。例如echo "password" | passwd --stdin username
注意:passwd命令后带有username参数表示处理其它用户密码,不带则是修改当前用户自己的密码。只有root用户能给其它用户创建密码并执行修改、删除、锁定密码等操作,普通用户只能修改自己的密码
4、usermod:修改用户信息,但不允许修改正在被使用的账户
用法:usermod [option]... username
常用选项:
-c:修改用户的注释信息,即/etc/passwd文件中第5段内容
-d:修改用户家目录
-u:修改UID
-g:修改基本组
-G:修改附加组
-s:修改shell
-L:锁定密码,使用户无法登录
-U:解锁密码
...
例 usermod -L tesla
5、userdel:删除用户
用法:userdel [-r] [-f] username
常用选项:
-r:与该用户相关的所有资料也一并删除,包括家目录及/etc/{passwd,shadow,group}内的对应信息
-f:强制删除,即使该用户在线
例 userdel -r tesla
6、chage:修改密码的有效期,即/etc/shadow文件中的一些参数
用法:chage [option]... username
常用选项:
-m:密码最短使用期限
-M:密码过期期限
-W:密码过期后宽限的天数
-l:查看当前的设置
...
例 chage -W 10 tesla
7、chfn:修改用户的finger信息
chfn [option]... [username]
不指定任何选项则进入交互模式,不指定用户名则修改当前用户自身信息
只有root能够设置所有用户finger信息,其它用户只能设置自身finger信息
[nolan@localhost ~]$ chfn Changing finger information for nolan. Password: Name []: nolan Office []: 2046 Office Phone []: 2222 Home Phone []: 3333 Finger information changed. [nolan@localhost ~]$ finger nolan Login: nolan Name: nolan Directory: /home/nolan Shell: /bin/bash Office: 2046, x2222 Home Phone: x3333 Never logged in. No mail. No Plan. [nolan@localhost ~]$ chfn -h 8888 #单独修改home phone
三、用户信息的查看
1、id:显示用户的UID、GID、所属的组
用法:id [option]... [用户名]
-u:仅显示UID
-g:仅显示GID
-un:仅显示用户名
-gn:仅显示基本群组名
不带参数则显示当前用户的UID等信息
[root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]# id tesla uid=502(tesla) gid=502(tesla) groups=502(tesla),501(davinci) [root@localhost ~]# id -gn tesla tesla
2、who或w:显示当前登录系统的用户信息
[root@localhost ~]# w 19:07:07 up 7:25, 4 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - Wed21 1:51m 0.04s 0.04s -bash root pts/0 192.168.30.1 17:17 0.00s 0.24s 0.00s w tesla pts/1 192.168.30.1 19:03 3:31 0.00s 0.00s -bash [root@localhost ~]# who root tty1 2015-09-30 21:21 root pts/0 2015-10-05 17:17 (192.168.30.1) tesla pts/1 2015-10-05 19:03 (192.168.30.1)
3、last:显示用户最近登录信息
用法:last [option]... [用户名/终端]
常用选项:
-n #或-#:指定显示#条记录
-d:将IP地址转换成主机名
[root@localhost ~]# last -3 tesla pts/1 192.168.30.1 Mon Oct 5 19:03 still logged in tesla pts/2 192.168.30.1 Mon Oct 5 17:17 gone - no logout root pts/0 192.168.30.1 Mon Oct 5 17:17 still logged in wtmp begins Thu Aug 6 05:14:00 2015 [root@localhost ~]# last tesla tesla pts/1 192.168.30.1 Mon Oct 5 19:03 still logged in tesla pts/2 192.168.30.1 Mon Oct 5 17:17 gone - no logout tesla pts/2 192.168.30.1 Mon Oct 5 17:16 - 17:16 (00:00) ... wtmp begins Thu Aug 6 05:14:00 2015 [root@localhost ~]# last -3 tty1 root tty1 Wed Sep 30 21:21 still logged in root tty1 Mon Aug 10 13:49 - 21:19 (51+07:30) root tty1 Mon Aug 10 13:42 - down (00:04) wtmp begins Thu Aug 6 05:14:00 2015
4、lastlog:显示系统中所有用户最近一次的登录信息
用法:lastlog [option]...
常用选项:
-u username:显示指定用户的最近一次登录信息
-t 天数:显示指定天数以内的登录信息
-b 天数:显示指定天数以前的登录信息
[root@localhost ~]# lastlog Username Port From Latest root pts/0 192.168.30.1 Mon Oct 5 17:17:05 +0800 2015 bin **Never logged in** daemon **Never logged in** ... tesla pts/1 192.168.30.1 Mon Oct 5 19:03:36 +0800 2015
5、finger:查看用户信息,包括登录信息、真实名称、家目录等;该命令需额外安装
用法:finger [option]... [本地用户]... [远程用户@主机]
不指定任何选项和参数则显示本地用户登录信息
该命令可查看远程主机用户信息,前提是远程主机上已运行finger服务进程
[root@localhost ~]# finger Login Name Tty Idle Login Time Office Office Phone root root tty1 14:54 Sep 30 21:21 root root pts/0 1:28 Oct 6 05:18 (192.168.30.1) root root pts/2 Oct 6 07:51 (192.168.30.1) tesla pts/1 1:28 Oct 6 06:40 (192.168.30.1) [root@localhost ~]# finger root Login: root Name: root Directory: /root Shell: /bin/bash On since Wed Sep 30 21:21 (CST) on tty1 14 hours 54 minutes idle On since Tue Oct 6 05:18 (CST) on pts/0 from 192.168.30.1 1 hour 28 minutes idle On since Tue Oct 6 07:51 (CST) on pts/2 from 192.168.30.1 No mail. No Plan.
四、用户之间的切换(su和sudo)
1、su:切换至其它用户
用法:su [-] [-c] [-m] [username]
选项:
-c:执行完指定的指令后恢复原来身份,如su - -c "userdel pulak" root
-m:变更身份时不变更环境变量
不指定目标用户时,则为切换到root用户
root切换到其它用户不需输入密码,其它用户切到root或其它用户之间切换需输入密码
su username与su - username的区别:
su命令后是否有-选项差别很大,su username是以非交互式登录的方式取得shell(no-login shell),这种方式很多变量仍保留原值,如下,当在当前用户wittgenstein下使用mail命令查看邮件时,实际上查看的却是原来用户tesla的邮件。退出no-login shell使用exit命令。
而su - username属于交互式登录(login shell),会完全取得新用户的环境。退出login shell使用logout命令
[tesla@localhost ~]$ su wittgenstein Password: [wittgenstein@localhost tesla]$ env | grep ‘tesla‘ PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/tesla/bin MAIL=/var/spool/mail/tesla PWD=/home/tesla [wittgenstein@localhost tesla]$ exit exit [tesla@localhost ~]$ su - wittgenstein Password: [wittgenstein@localhost ~]$ env | grep ‘tesla‘ [wittgenstein@localhost ~]$ env | grep ‘wittgenstein‘ USER=wittgenstein MAIL=/var/spool/mail/wittgenstein PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wittgenstein/bin PWD=/home/wittgenstein HOME=/home/wittgenstein LOGNAME=wittgenstein [wittgenstein@localhost ~]$ logout [tesla@localhost ~]$ su - -c "tail -1 /etc/shadow" root Password: pulak:!!:16713:0:99999:7:2:16714:
2、sudo:以其它用户身份来执行命令,预设为root
由于root权力太过强大,基于安全和防止误操作考虑,root密码宜尽量减少传播,使用者多以普通用户身份登录。但有时候又需要临时执行一些只有root才有权限执行的操作,这时候就可以用到sudo了
1)suso能做什么?
a.限定指定用户在指定主机上运行指定的管理命令,减少了用户因为错误或恶意执行命令损坏系统的可能性
b.详细记录用户基于sudo执行的命令的相关日志信息
c.“检查系统”:用户第一次执行sudo会要求输入自己的密码,用户会获得一个有固定存活时长的“入场券”(默认为5分钟),逾期后若想再次执行sudo命令需要重新输入密码
2)sudo执行流程:
①当用户执行sudo时,系统根据/etc/sudoers文件检查其是否有相应权限
②若有相应权限,要求用户输入自己的密码以确认
③认证通过后用户便可执行指定的命令
3)某用户若想使用sudo执行其它用户才能执行的命令,则需要root用户先使用专用编辑命令visudo编辑/etc/sudoers文件,授予该用户所需要的权限。/etc/sudoers是有特定语法的,故需使用visudo命令编辑
/etc/sudoer语法:
[%]WHO HOST=(WHOM) [NOPASSWD:] COMMAND
①WHO表示用户,前面若有%表示群组
②HOST表示登录者的来源主机
③WHOM表示可切换的身份
④NOPASSWD表示免除密码输入,可选项,一般用于信任的用户
⑤COMMAND表示可执行的命令
例 gentoo ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
当要指定的参数太长时,可使用别名,格式为:
Alias_Type NAME = item1, item2...
其中Alias_Type可以是User_Alias(用户别名)、Runas_Alias(可切换成的身份别名)、Host_Alias(主机别名)、Cmnd_Alias(命令别名);别名列表中可再嵌套别名
注意:别名本身必须使用全大写字母
用户别名:
可用项:USERNAME,%GROUPNAME,#UID,#GID,User_Alias
格式:User_Alias NAME1 = item1,item2 : NAME2 = item3,item4
主机别名:
可用项:hostname,ip,network_address,host_alias
格式:Host_Alias NAME = item1,item2
命令别名:
可用项:命令名,目录(目录下的所有命令),"sudoedit",Cmnd_Alias
格式:Cmnd_Alias NAME = item1,item2
/etc/sudoers编辑示例:
User_Alias GENIUS = davinci,tesla,wittgenstein,%director
Cmnd_Alias CHANGE = /usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
GENIUS ALL=(root) Cmnd_Alias CHANGE
4)sudo命令的用法
sudo [option]... [-u username]
常用选项:
-b 命令:在后台执行命令
-l:列出目前用户可执行与无法执行的命令
-e 文件路径:编辑文件而非执行命令
-k:清除“入场券”
-u 用户名:指定切换到哪个用户,如不指定,默认为root
-p 提示语:可以更改询问密码的提示语,其可用%u变量来替换为用户名,%h替换为主机名
[root@localhost ~]# visudo #includedir /etc/sudoers.d User_Alias GENIUS = tesla,davinci,%director Cmnd_Alias CHANGE = /usr/sbin/useradd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root GENIUS ALL=(ALL) CHANGE [root@localhost ~]# su - tesla [tesla@localhost ~]$ sudo useradd super [sudo] password for tesla: [tesla@localhost ~]$ tail -2 /etc/passwd kubrick:x:504:504::/home/kubrick:/bin/bash super:x:505:506::/home/super:/bin/bash [tesla@localhost ~]$ sudo passwd super Changing password for user super. New password: [tesla@localhost ~]$ sudo -l ... User tesla may run the following commands on this host: (ALL) /usr/sbin/useradd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root [tesla@localhost ~]$ sudo -k [tesla@localhost ~]$ sudo userdel super [sudo] password for tesla: Sorry, user tesla is not allowed to execute ‘/usr/sbin/userdel super‘ as root on localhost.localdomain.
五、群组管理
1、groupadd:创建群组
用法:groupadd [-g GID] [-r] groupname
-r:创建系统组,若不指定-g GID,会自动指定一个小于500的GID
例groupadd science
2、groups:显示用户所在的组
用法:groups [username]
不带参数则直接显示当前用户所在的组
[tesla@localhost ~]$ groups tesla wittgenstein [tesla@localhost ~]$ groups wittgenstein wittgenstein : wittgenstein
结果中的第一个为用户的有效群组,默认为用户的基本组。如上,用户tesla属于组tesla、wittgenstein,其有效组为tesla。该用户创建的新文件的默认属组即为有效属组,若想更改用户的有效组,可使用newgrp命令
3、newgrp:切换用户的有效群组
用法:newgrp [groupname]
不指定参数则为切换为基本组
[tesla@localhost ~]$ newgrp wittgenstein [tesla@localhost ~]$ groups wittgenstein tesla [tesla@localhost ~]$ touch abc [tesla@localhost ~]$ ls -l abc -rw-r--r-- 1 tesla wittgenstein 0 Oct 5 15:03 abc
4、groupmod:修改群组
用法:groupmod [-g GID] [-n newname] groupname
常用选项:
-g:修改群组的GID
-n:修改群组名
5、groupdel:删除群组
用法:groupdel groupname
若目标群组为某用户的基本组,则不能被删除,除非先删除关联的用户;若只为其它用户的附加组,则可以删除
6、gpasswd:设置或修改组密码,设置群组管理员
群组通常不设密码,该命令主要用来设置群组管理员。因为默认只有root才能管理群组,但有时用户申请加入某群组时root太忙而无暇处理,这种情况下root就可以设定某个用户作为该群组的管理员来帮其管理
root能做的动作:
gpasswd [-A user...] [-M user...] [-r] [-R] groupname
-A:指定群组的管理员
-M:将用户加入群组
-r:删除群组密码
-R:失群组密码失效
不指定任何选项则表示给群组设置密码
群组管理员能做的动作:
passwd [-a user...] [-d user...] groupname
-a:将用户加入群组
-d:将用户移出群组
[root@localhost ~]# tail -2 /etc/group director:x:505:kubrick,nolan hitchcock:x:506: [root@localhost ~]# gpasswd -A kubrick director [root@localhost ~]# su - kubrick [kubrick@localhost ~]$ gpasswd -a hitchcock director Adding user hitchcock to group director [kubrick@localhost ~]$ tail -2 /etc/group director:x:505:kubrick,nolan,hitchcock hitchcock:x:506:
原文地址:http://9124573.blog.51cto.com/9114573/1700512