目录
用户和组概述
1
用户登录过程
1
账号信息文件/etc/passwd
1
密码文件 /etc/shadow
3
组文件/etc/group与/etc/gshadow
3
账号管理
4
用户管理
4
组管理
5
手动新增用户
6
ALC简介
6
用户的特殊shell
7
PAM模块简介
7
用户信息传递
9
用户和组概述
用户账号:超级用户root、普通用户、程序用户
组账号:基本组、附加组
UID和GID:UID(user identity),GID(group identify)
超级用户:超级用户的UID和GID都固定为 0。
程序用户:用于维持系统或某个程序的正常运行,通常 1~499的UID、GID默认保留给程序用户使用,程序用户的登录shell为/sbin/nologin。
普通用户:一般只在用户自己的宿主目录中有完全权限,UID、GID号在500~60000之间。
用户登录过程
1)
使用tty1~tty7终端机提供的login接口,输入账号和密码
2)
读取账号信息文件/etc/passwd,查看账号是否存在,若存在则读取UID、GID、宿主目录、shell目录,进行下一步(早期的UNIX系统密码也在passwd文件中,后来出于安全方面的考虑,将密码数据存放到/etc/shadow文件中了)
3)
读取密码信息文件/etc/shadow,根据用户名验证密码是否一致,若一致则进入shell执行阶段。
账号信息文件/etc/passwd
/etc/passwd文件是系统能够识别用户的一份清单。在用户登录期间,系统查询这个文件,确定用户的UID并验证用户的口令(早期的密码保存在passwd的第二个字段中,后来出于安全方面的考虑,将密码信息单独保存在/etc/shadow文件中)。/etc/passwd文件的权限为644,所有者和所属组为root。这个文件中的每一行都代表一个用户,它包含7个由冒号分割的字段:
root:x:0:0:test:/root:/bin/bash
登录名:密码或占位符(x):UID:GID:GECOS字段:主目录:登录shell
1)
登录名
用户名必须是唯一的,长度一般不超过32个字符。如果使用了NIS系统,登录名的长度需要限制在8个字符以内。用户名大小写敏感。
2)
密码
早期的UNIX系统的密码存放在这个字段上,但是由于所有的程序都能读取passwd文件,这样很容易造成安全隐患,因此后来就将加密后的口令放在/etc/shadow文件中了。
如果通过手工编辑/etc/passwd文件来创建一个账号,那么要在加密口令字段添加一个星号*或者一个占位符x,星号*可以防止在设置一个真实的口令之前发生未经授权使用该账号的情况,如果该字段为空则不用口号就可以访问该账号,占位符x会去/etc/shadow文件中读取口令信息。一个感叹号表示被锁定,只有两个感叹号表示未设置密码,而两个感叹号后面是加密的密码则表示被锁定。
3)
UID
UID是32位的无符号整数。多个账号可以有相同的UID,而一个账号只能有一个UID。比较安全的用法是保持UID的唯一性,即一个特定的UID在每台计算机上都应该指的是相同登录名和同一个用户,可以避免工作组迁移时造成账号信息混乱。同时还要避免许多账号共用一个UID,因为共用一个UID虽然多个具有不同shell和口令的登录账户似乎比较方便,但这种设置会产生更多潜在的安全隐患。
4)
GID
和UID类似,组的ID是一个32位的整数。GID 0是给超级用户root的组保留的,GID 1是名为“bin”的组,GID 2是“daemon”组。组在/etc/group文件中定义,/etc/passwd中的GID字段在登录时提供默认(或有效)GID,在判断访问权限时不是特别看重默认GID,而在创建新文件和新目录时才起作用,新文件一般由用户的有效组所有。新文件默认为父目录的组所有。
5)
GECOS字段
GECOS字段通常用来记录每个用户的个人信息。最初GECOS字段是用来保存登录信息的。使用finger命令会按特定顺序来解释哪些用逗号隔开的GECOS选项。chsh命令可以让用户修改他们自己的GECOS信息。
6)
主目录
当用户登录之后,他们的shell就进入到自己的主目录中。root用户的主目录是/root。创建用户时,linux系统默认会为新用户创建宿主目录,默认宿主目录为/home/Username,并且将/etc/skel下的所有文件拷贝到用户的宿主目录。
如果把/etc/login.defs中的DEFAULT_HOME设为no,那么就会禁止没有主目录的用户登录。否则登录后用户会处在根目录下。
7)
登录shell
bash是默认的shell,如果/etc/passwd中没有指定一个登录shell,就会使用bash。用户可以使用chsh命令来改变自己所使用的shell,文件/etc/shells中包含了chsh命令允许用户选择使用的有效shell的列表。
密码文件 /etc/shadow
只用超级用户才可以读/etc/shadow,它用于保护加密口令的安全。还提供了无法从/etc/passwd得到的账号信息。有些发行版本采用的是隐藏口令系统,这时/etc/passwd文件中口令字段一定要包含一个x。
/etc/shadow文件的权限是400,所有者和所属组是root。
/etc/shadow中每个用户有一行信息,每行用冒号分隔为9个字段:
1)
登录名:与/etc/passwd中的登录名相同,联系用户在passwd和shadow中的记录
2)
加密的口令,如果只是两个感叹号则表示为设置密码;如果密码前面有感叹号则表示被锁定,此时无法登录。
3)
上次修改口令的时间
4)
两次修改口令指尖最少的天数
5)
两次修改口令指尖最多的天数
6)
提前多少天警告用户口令即将过期
7)
在口令过期之后多少天禁用账号
8)
账号过期的日期
9)
保留字段,目前为空
可以在/etc/login.defs文件中进行相关设置。
组文件/etc/group与/etc/gshadow
/etc/group文件记录了与组相关的信息。/etc/group的权限为644,所有者和所属组为root。
每一行代表了一个组,其中包含4个字段:
1)
组名
2)
加密的口令或者包含一个占位符x,表明有一个/etc/gshadow文件
3)
GID号
4)
成员列表,用逗号隔开
有效用户组(effective group)与初始用户组(initial group)
在/etc/passwd里面第四段列出的GID为用户的“初始用户组”,当用户登录系统时,就用户这个组的相关权限。而一个用户不但拥有私有组,还可以用户附加组,这时对于已经存在的文件用于在两个组内都有权限,如果此时要创建一个新的文件或新目录,这个新文件是属于用户的私有组还是附加组呢?这就要查看当时用户的“有效用户组”了。
可以使用groups命令查看当前用户的有效用户组,使用newgrp命令切换“有效用户组”,你想要切换的用户组必须是你已经支持的用户组,newgrp切换有效用户组时,会以一个新用户组的shell来提供这个功能。newgrp – log in to a new group.
/etc/gshadow文件与/etc/shadow的概念类似,权限为400,拥有者和组为root,分为4个字段:
1)
用户组名
2)
密码列,如果是感叹号,则表示无合法密码,没有用户组管理员(QQ群管理员,非创建者)
3)
用户组的管理员账号
4)
该用户组的所属账号(与/etc/group内容相同)
账号管理
用户管理
新增用户的过程包括系统要求的4个步骤,和为新用户建立环境的2个步骤。
系统所需步骤:
编辑psswd和shadow文件,定义用户账号
把用户添加到/etc/group文件里
设置一个初始口令
创建用户主目录,用chown和chmod命令改变用户主目录的属主和属性。
为用户所进行的步骤:
将默认的启动文件复制到用户的主目录中
设置用户的邮件主目录并建立邮件别名
1)
adduser命令
-c 设置用户的备注信息,用finger命令显示为Name
-g 指定用户的私有组,默认组名与用户名相同,组需要已经存在
-G 指定附加组
-p 指定密码,这里指定的密码时明文的。如果没有指定,需要使用passwd 设置密码
-u 指定用户的UID
-d 设置用户的主目录
如 useradd –d /home/test –c abcde test
2)
passwd设置用户密码
-l 锁定用户,被锁定用户将不能登录
-u 解除对用户的锁定
-d 删除用户密码
-S 显示用户名的简短描述,仅root用户可以使用
passwd可以改变当前用户的密码,psswd user_name修改用户的密码。
使用chage –l user_name 也可以查看密码参数的详细信息。
3) userdel删除用户
-f 强制删除用户,即使用户当前已登录
-r 删除用户的同时,删除与用户相关的所有文件
手动删除用户需要以下步骤:
将用户从所有本地用户DB或电话簿中删除
将用户从aliases文件中删除,或者添加一个转发地址
删除用户的crontab文件盒所有挂起的at作业
终止所有仍在运行的用户进程
将用户从passwd、shadow、group、gshadow文件中删除
删除用户的主目录
删除用户的邮件存储文件
然后使用find命令,查看用户的旧UID在系统中是否还拥有文件。
find file_system –xdev –nouser
-xdev参数指定只在当前文件系统中查找,-nouser指定查找没有匹配用户UID的文件。
4)
usermod修改用户
-c 修改用户的GECOS注释信息
-d 修改用户的主目录
-e 用户的过期日期,/etc/shadow中的第八段,格式为YYYY-MM-DD
-g 修改用户的初始用户组,/etc/passwd中的第四段,给定的组必须存在,默认GID为1.
-G 将用户添加到指定的附加组中去,/etc/group的第四段
-l 修改登录名,即/etc/passwd的第一段
-a 向组中追加用户,与-G合用增加附加组
-p 设置新的加过密的密码
-s 修改用户登录的默认shell,/etc/passwd的第七段,相当于chsh –s
-u 用户的ID
-L 锁定用户的密码,在密码字段前添加感叹号,禁止用户登录,/etc/shadow的第二段
-U 解锁用户密码,去密码字段前面的掉感叹号
5)
chsh改变用户的登录shell
-s 指定新的默认shell
-l 打印当前系统支持的shell程序
6)
chfn改变用户finger信息
改变/etc/passwd中的第五段
7)
id
显示用户的定义信息
8)
finger
-l 多行方式显示用户信息
不带参数则显示当前已登录系统的用户信息。
9)
批量创建用户
newusers:参数为指定的文本文件,格式要与/etc/passwd相同
10)
chpasswd批处理方式更新密码
-h 显示帮助信息并退出
组管理
1)
groupadd
-g 指定新建组的GID,GID在500~6000之间
-r 创建系统工作组,GID在1~499之间
-K 设置GID的最大值和最小值,覆盖/etc/login.defs中的 GID_MIN、GID_MAX
-o 允许添加GID不唯一的工作组
例如
groupadd –g 400 test #创建GID为400的系统工作组
默认不允许创建具有相同GID的组,如果使用 –o 参数则可以创建。
2)
groupdel
groupdel命令无法删除用户的主要组,如创建用户test时默认创建了主要组test,在不删除test用户的情况下,无法直接删除test组。如果test组中只有test一个用户,这时删除test用户会把test组也删除。如果向test组中追加了用户test1,则删除test用户时,不会级联删除组test。
3)
groupmod
-g 指定新的GID
-n 指定新的组名
新GID和组名必须唯一。
4)
gpasswd
-a 向组中添加用户
-d 从组中删除用户
-A 设置组管理员
-M 设置组成员
也可以使用usermod向组中添加用户,gpasswd –a test test1 将test用户加到test1工作组。
5)
groups
默认打印当前用户所属的工作组,加上用户名则打印指定用户的所属工作组。
使用newgrp命令可以指定用户的有效工作组(新建文件或目录的所属组)。
6)
chpasswd批处理模式更新密码
-e 输入的密码是加密后的密文
-m 当被支持的密码未被加密时,使用MD5加密代替DES加密
7)
pwconv
基于/etc/passwd创建用户影子文件/etc/shadow
8)
pwunconv
将用户的/etc/shadow还原到/etc/passwd
手动新增用户
1)
一些检查工具
pwck、pwconv、pwunconv、grpconv、grpunconv
pwck:验证/etc/passwd和/etc/shadow的内容和格式的完整性。
pwconv:基于/etc/passwd创建/etc/shadow文件。即将/etc/passwd中的账号和密码移动到/etc/shadow文件中。
pwuncov:还原用户密码到/etc/passwd中。
grpconv:创建组的影子文件,基于/etc/group创建/etc/gshadow文件。
grpunconv:还原组密码到/etc/group文件。
2)
手工创建账号
创建用户组 /etc/group
将/etc/group与/etc/gshadow同步 grpconv
新建账号的属性 /etc/passwd
将/etc/passwd与/etc/shadow同步
设置密码 passwd user_name
创建宿主目录 cp –a /etc/skel /home/user_name
更改宿主目录的属性 chown –R user_name:group_name /home/user_name
ALC简介
ALC是Access Control List的缩写,在提供传统的owner、group、others的read、write、execute权限之外进行更加细致的权限配置。
ACL可以针对单一使用者、单一文件或目录来进行r、w、x权限规范。
ACL可以针对默认属性(mask)来配置权限,指定在某目录下创建新文件或目录时的默认权限。
格式u:[user_name]:[rwx],g:[group_name]:[rwx], m:[rws]
先查看你的系统是否已经支持ACL:
shell> mout; #查看当前系统已挂载的系统
shell>dumpe2fs –h /dev/sda2 #查看某个ext2/ext3文件系统的信息
Default mount options: user_xattr acl
如果这行里面有acl则表明当前文件系统支持ACL功能。
添加ACL支持
编辑/etc/fstab文件,LABEL这行的defaults后面加上acl。
LABEL=/ / ext3 defaults, acl 1 1
ACL设置
setfacl:设置某个目录/文件的ACL,set file access control list
getfacl:查看某个目录/文件的ACL
setfacl [-bkRd] [{-m|-x} acl参数 ] 目标文件名
-m:修改文件/目录的acl参数(modify)
-x: 删除acl参数(remove)
-b: 删除所有的acl参数
-k: 删除默认的acl参数
-R:设置递归的acl参数
-d: 设置默认的acl参数,只可针对目录使用,在该目录新建的数据继承
setfacl –m u:test1:rx file_name
#设置用户test1对file_name文件rx权限,如果没有用户列表,指owner
用户的特殊shell
系统账号的登录shell使用的是/sbin/nologin,允许系统账号使用指定的系统服务和资源,而不能登录系统。登录的时候,系统会给出提示信息,可以在/etc/nologin.txt文件内指定给出的提示信息。
PAM模块简介
•
出于安全方面的原因,只有经过授权的用户才能访问计算机系统,就是在访问前需要进行身份鉴别。最初linux系统的用户鉴别就像UNIX系统一样(对UNIX不了解),系统管理员为用户建立账号并为其制定口令,用户用这个口令登录后重新设置自己的口令,这样用户就有了一个只有他自己知道的密码,存储在/etc/shadow文件中。当用户登录时,登录程序提示用户输入账号和密码,然后与/etc/passwd和/etc/shadow文件中的内容进行对比,如果符合则成功登录。
•
后来,还有许多其他的鉴别用户的方法,如用于网络环境的Kerberos以及基于智能卡的鉴别系统等。(需要身份识别的程序如su、sudo、smtp、sshd等),但是这些程序都有一个通病:实现鉴别功能的代码通常作为程序的一部分而一起编译,这样如果需要采用另一种鉴别方法时,就不得不修改或重写编译程序然后重新编译,十分耗费时间,缺乏灵活性,也增加了系统管理的复杂度。
•
鉴于这个原因,人们开始寻找一种更加的方案:将鉴别功能从应用中独立出来,对鉴别功能进行模块化管理;另一方面,为这些鉴别模块建立标准的API,以便各应用程序能够方便的使用它们提供的各种功能。
•
PAM机制把多个低级别验证模式集成到高级别的API中,单个程序也可以轻易地集成多种验证机制,同时可以很方便的编写或替换原来的验证程序,而不需要重新编写或修改应用程序的编译文件。这一思路非常符合软件工程中的“高内聚,低耦合”的思想。
•
分层结构:从图中可以看出,PAM API起着承上启下的作用,将应用程序和鉴别模块联系起来。当应用程序调用PAM API时,应用程序接口层按照配置文件/etc/pam.d或/etc/pam.conf(旧版本)的设置,来加载相应的验证模块。然后把应用程序的请求传递给底层的验证模块,验证模块执行验证并将验证结果返回给PAM API,然后应用接口层根据配置的具体情况将来自鉴别模块的应答返回给应用程序。
1)
PAM模块分类
PAM模块按照验证类型进行归类。任何给定的模块至少要实现四种模块类型的功能之一。
1.
认证模块auth:用于验证用户或设置/销毁凭证。
2.
账户管理模块account:验证与访问、账户及凭证有效期、密码规则等有关的操作。
3.
会话管理模块session:用户初始化和终止会话。
4.
密码管理模块password:执行与密码更改/更新有关的操作。
2)
PAM配置文件
#%PAM-1.0
#module_type control_flag module_path module_option/module_args
auth
required pam_env.so
account
sufficient
pam_succeed_if.so uid < 500 quiet
password
requisite pam_cracklib.so try_first_pass retry=3
session
optional pam_keyinit.so revoke
PAM配置通常是在/etc/pam.d或/etc/pam.conf中的配置文件实现的。对于使用PAM的各项服务,目录中都有一个对应的同名文件,其中包含如何获取该服务的验证及账户信息的规则或说明。通常每一行对应一个规则。
PAM配置文件中的字段包括:
Service_name指定服务/应用程序的名称(默认值为other,redhat中为PAM版本号)
Module_type为相应的服务指定模块类型(auth/account/session/password)
Control_flag指定模块的堆栈行为(required/requisite/sufficient/optional)
Modul_path指定实现模块功能的库对象。默认路径为/lib/security
Module_options/module_args(可选字段)指定可以传递给服务模块的选项或实参
模块将按照在配置文件中列出的顺序被调用,同时也取决于control_flag(返回验证结果,影响下一步的操作)的值。control_flag的值包括:
required:不论required模块验证标志为success或failure都会进行后续的验证流程。堆栈中的所有 Required 模块被看做是一个结果。当有多个required模块时,即使某个模块对用户的验证失败,也要等所有的模块都执行完毕,PAM才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。
requisite:/ˈrek.wɪ.zɪt/(必要的):若验证失败则返回failure标志,终止后续的验证流程。
sufficient:若验证成功则返回success标志给原程序,并终止后续的验证流程。若验证失败则返回failure标志,并进行后续验证流程。返回success后,即使后面的层叠模块使用requisite或者required控制标志,也不再执行。如果验证失败,sufficient的作用和optional相同。
optional:表示即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用这个标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块
control_flag中的include指定PAM调用include后面的文件作为这个类别的验证文件。
3)
PAM常用模块简介
PAM模块提供不同的功能,例如登录验证、访问控制等。每个功能的实现都是由不同的模块处理的。PAM配置文件的目录:
/lib/security:实现模块功能的库对象的默认路径(module_path)
/etc/pam.d:特定程序的PAM配置文件目录
/etc/security:其他PAM配置文件目录
/usr/share/doc/pam*:PAM的说明文档
PAM主要模块:
pam_access根据/etc/security/access.conf中的预定义规则进行登录访问控制(root可以通过tty1~tty7终端、指定IP的主机、局域网、域等方式访问主机,telnet不可)。
pam_security.so限制root只能从安全的终端登录。
pam_nologin.so限制一般用户是否能够登录主机。与上节中提到的/sbin/nologin不同(登录shell)。 当/etc/nologin文件存在时,所有的普通用户都无法登录系统,当尝试登录是会出现错误提示/etc/nologin的内容(root用户登录时也会显示)。
pam_selinux.so与用户执行程序的权限有关。
pam_loginuid.so可用于规范用户的UID。
pam_env设置set/unset环境变量/etc/security/pam_env.conf。
pam_cracklib根据密码规则检查密码。
pam_unix通过/etc/passwd提供传统密码验证。
pam_limits.so限制用户能够使用的系统资源。
pam_debug调试PAM。
4)
与PAM相关的日志文件
/var/log/secure: 记录PAM模块的相关操作(记录做了什么)。
用户信息传递
w: 查看已登录的用户和正在执行的指令。
who:查看当前系统的登录用户信息。
last:显示用户的最近登录列表,默认读取/var/log/wtmp(登录记录)。
lastlog:显示用户最近一次的登录信息。
lastb:显示用户错误的登录列表,读取/var/log/btmp日志。
whoami:打印当前用户名。
users:打印登录到当前系统的用户名。
1)
用户对话
write:向指定用户终端发送信息,使用ctrl+d终止输入
mesg:设置当前终端的写权限,是否允许其他用户向本终端发送信息(针对非root)。
wall:向系统当前所有打开的终端上输出信息。
2)
邮件mail
mail指令是命令行的电子邮件接受和发送工具。linux系统将接收到的邮件存放在/var/spool/mail/user_name文件中。使用mail指定阅读过的邮件,将被保存到其宿主目录下的mbox文件中。
在mail中的提示符是&,提示符状态下>指的是当前在处理的邮件,N表示该封邮件未读,输入?查看mail提示符下的内部命令,使用quit退出mail指令,v阅读邮件,d删除邮件,h显示邮件列表。
写邮件:
[root@localhost mail]# mail -s "test" root@localhost
查看已读邮件:
[root@localhost ~]# mail -f /root/mbox