Linux 用户管理
磁针石
联系方式:
QQ:37391319 gmail and gtalk: xurongzhong@gmail.com
2008-05-09 完成初稿,OReilly.Running.Linux.5th.Edition 中关于umask的内容还没有归纳。《Linux 基础教程(1) 操作系统基础》中的内容未整合。今后还需要转移部分内容至《文件和目录管理》。《鸟哥的 Linux 私房菜》之 “账号管理”也只总结至useradd处。
参考资料... 1
管理用户账号... 1
/etc/passwd文件... 1
/etc/shadow.. 3
PAM和其他认证方式... 4
组文件... 4
创建用户... 5
删除和禁用用户... 5
修改用户... 5
文件属主和权限... 5
权限的含义... 5
属主和组... 6
改变属主,组和权限... 6
chmod. 6
suid/guid. 7
chown和chgrp. 8
umask. 8
*《OReilly.Running.Linux.5th.Edition.Dec.2005》之
Chapter 11. Managing Users, Groups, and Permissions
*《LINUX与UNIX
SHELL编程指南》之 §1文件安全与权限
*《鸟哥的 Linux 私房菜》之 “账号管理”
/etc/passwd格式如下:
username:password:uid:gid:gecos:homedir:shell
· 如何登入 Linux 取得
UID/GID
输入账号与密码后, Linux 会:
- 先找寻
/etc/passwd 里面是否有这个账号?如果没有则跳出,如果有的话则将该账号对应的 UID (
User ID )与 GID ( Group ID )读出来,另外,该账号的家目录与 shell 设定也一并读出;
- 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
- 如果一切都 OK
的话,就进入 Shell 控管的阶段啰!
几个需要说明的字段
password:早期的 Unix 系统的密码是放在这个档案中的, 但是因为这个档案的特性是所有的程序都能够读取,所以,这样一来很容易造成数据的被窃取,
因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了,关于
/etc/shadow 这一部份等一下再说。而这里你会看到一个 x ,呵呵!别担心,这表示密码已经被移动到 shadow 这个加密过后的档案啰;如果一个字符是*,表示不允许改用户登陆
UID:这个就是使用者识别码 (ID) 啰!通常 Linux 对于
UID 有几个限制需要说给您了解一下:
|
id 范围
|
该 ID 使用者特性
|
|
0
|
当 UID 是 0 时,代表这个账号是『系统管理员』!所以当你要作另一个系统管理员账号时,
你可以将该账号的 UID 改成 0 即可;这也就是说,一部系统上面的系统管理员不见得只有 root 喔! 不过,不很建议有多个账号的 UID 是 0 啦~
|
|
1~499
|
保留给系统使用的 ID,其实
1~65534 之间的账号并没有不同, 也就是除了 0 之外,其它的 UID 并没有不一样,预设 500 以下给系统作为保留账号只是一个习惯。这样的好处是,以有名的 DNS 服务器的启动服务『 named 』为例,这个程序的预设所有人 named 的账号 UID 是
25 ,当有其它的账号同样是 25 时,很可能会造成系统的一些小问题!为了杜绝这样的问题,建议保留 500 以前的 UID 给系统吧!
不过,一般来说, 1~99 会保留给系统预设的账号,另外
100~499 则保留给一些服务来使用。
|
|
500~65535
|
给一般使用者用的。事实上,目前的 linux 核心 (2.6.x 版)已经可以支持到
4294967295 (2^32-1) 这么大的 UID 号码喔!
|
Gecos:General Electric
Comprehensive Operating System。为了兼容而使用的这个名称。使用者信息说明栏:这个字段基本上并没有什么重要用途,
只是用来解释这个账号的意义而已!不过,如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息呢!底下的 chfn 可以解释一下啰!
Shell:有一个 shell 可以用来替代成让账号无法登入的指令!那就是 /sbin/nologin 这个东西!这也可以用来制作纯 pop 邮件账号者的数据呢!
如果确实要修改/etc/passwd ,建议使用vipw,它具有锁的功能。类似的命令有:vigr。
root组的用户才可以读这个文件,一般权限设置为-rw-r--r--。Debian
中可能要打开以确保使用shadow passwords。pwconv可以在/etc/passwd和/etc/shadow中互转。Pwunconv可以实现同样的功能,不过安全性不好,很少使用。
# cat /etc/shadow
root:$1$86ubUPuC$klZU23svq1c.5KL/b9rG31:13950:0:99999:7:::
bin:*:13950:0:99999:7:::
- 账号名称
- 密码:这个才是真正的密码,而且是 经过编码过的密码啦!
如果是在密码栏的第一个字符为『 * 』或者是『 ! 』,表示这个账号并不会被用来登入的意思。如果忘记了密码,把这个字段清空就可以。
- 最近更动密码的日期:这个字段记录了『更动密码的那一天』的日期,
不过,很奇怪呀!在我的例子中怎么会是 12959 呢?呵呵,这个是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 ,而 1971 年 1 月 1 日则为 366 啦! 所以这个日期是累加的呢!得注意一下这个资料呦!那么最近的
2005 年 1 月 1 日就是 12784 啦,了解了吗?
- 密码不可被更动的天数: 第四个字段记录了这个账号的密码需要经过几天才可以被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码呦!
- 密码需要重新变更的天数: 由于害怕密码被某些『有心人士』窃取而危害到整个系统的安全,所以有了这个字段的设计。
你必须要在这个时间之内重新设定你的密码,否则这个账号将会暂时失效。 而如果像上面的 99999 的话,那就表示,呵呵,密码不需要重新输入啦!
不过,如果是为了安全性,最好可以设定一段时间之后,严格要求使用者变更密码呢!
- 密码需要变更期限前的警告期限:当账号的密码失效期限快要到的时候,
就是上面那个『必须变更密码』的那个时间时, 系统会依据这个字段的设定,发出『警告』言论给这个账号,提醒他『再过 n
天你的密码就要失效了,请尽快重新设定你的密码呦!』,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。
- 密码过期的恕限时间:如果用户过了警告期限没有重新输入密码,
使得密码失效了,也就是说,你在『必须变更密码的期限前,并没有变更你的密码!』 那么该组密码就称为『失效的密码』啰~怎么办?没关系,还有这个字段的天数设计啊~
意思就是说,当密码失效后,你还可以用这个密码在 n 天内进行登入的意思。 而如果在这个天数后还是没有变更密码,呵呵!那么您的账号就失效了!无法登入!
- 账号失效日期:这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用。 这个字段会被使用通常应该是在『收费服务』的系统中,
你可以规定一个日期让该账号不能再使用啦!
- 保留:最后一个字段是保留的,看以后有没有新功能加入。
PAM和其他认证方式
还有其他很多的认证方法,比如:Kerberos(古希腊中守卫天堂之门的狗)。
Pluggable
Authentication Methods (PAM)用于不同的认证方式的切换,配置方法请见:http://www.kernel.org/pub/linux/libs/pam/
/etc/passwd中的gid设定了用户所属的组。一个用户可以属于多个组。
/etc/group的格式如下:
groupname:password:gid:members
password是可选的群组密码,允许不是改组的用户使用newgrp来访问该组。通常不需要设定,因为我们很少使用到群组登入! 不过,同样的,密码也是被纪录在 /etc/gshadow 当中啰!
Members是用逗号分隔的用户名。中间不能有空格,通常在/etc/passwd中的gid不是这个组,但是需要加入这个组的用户才需要加入。
# cat /etc/group
root:x:0:root
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
头两个组,root 和bin是管理组。
Gpasswd可以为组设定密码:
# gpasswd root
Changing the password for group root
New Password:
newgrp可以加入组:
$ groups
meil
$ newgrp root
Password:
$ groups
root meil
$ newgrp meil
$ groups
meil
如果password域为空,或者x和*开头,将会提示“permission denied”
创建文件和目录等的时候使用的是有效群组。即用groups看到的第一个组。可以通过newgrp切换。见上例。newgrp是以另一个 shell 登入的。离开群组可以使用exit。
文件可以属于特殊的组,用于共享文件。另外还有特殊硬件组等。
/etc/passwd添加用户,创建用户目录,设置用户目录的默认文件(比如:.bashrc)。
Red
Hat可以通过控制面板管理,SUSE为yast2。Debian使用adduser。
用户创建好后拷贝/etc/skel。
删除/etc/passwd和/etc/group相关,清空home目录,及/var/spool/mail,用户自己的文件等。
比如:userdel -r norbert。 -r表示删除用户目录。其他的用户相关文件,比如收件箱,crontab需要自己手工删除,一般使用find / -user username –ls来查找,前提是用户还存在。如果用户被删除了,可以使用-uid num。
禁用用户可以改/etc/shadow倒数第2个字段为0。修改/etc/passw中shell为/sbin/nologin。修改/etc/passw中第2个字段为*或!开头。比如一个同事离职了,但是他相关的文档还需要用,可以采取禁用账号的方式。
通常是修改/etc/passwd and /etc/group。命令有usermod and groupmod。
如果需要修改用户的uid,修改后要执行:chown -R aclark /home/aclark之类的操作。如果ls
–l显示数字的id,表示找不到id对应的用户名。
创建文件的用户和他(她)所属于的组拥有该文件。文件的属主可以设定谁具有读、写、执行该文件的权限。当然,根用户或系统管理员可以改变任何普通用户的设置。
当你创建一个文件的时候,系统保存了有关该文件的全部信息,包括:
•
文件的位置。
•
文件类型。
•
文件长度。
•
哪位用户拥有该文件,哪些用户可以访问该文件。
• i节点。
•
文件的修改时间。
•
文件的权限位。
查看文件属性
# ls -lh
total 4.0K
-rw-------
1 root root 344 Mar 15 17:35 ulog
注意:total 4.0K 是表示当前目录中所有文件的大小,不包含当前目录的子目录。1表示文件的硬连接。
文件的类型主要有:
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
一些工具会自动设置权限,比如编译程序创建可执行程序会自动添加可执行权限。
目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位. 执行权限位则意味着搜索和访问该目录
如果把同组用户或其他用户针对某一目录的权限设置为--x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。
目录的权限将会覆盖该目录中文件的权限。
目录的读和可执行看起来容易混淆,不过它们一般是同时出现和消失的。目录的写权限同时允许删除和添加文件。12章"Upgrading
Software Not Provided in Packages"中有可以共享目录,但是又不删除其他拥护文件的方法。
特殊文件(设备),sockets, symbolic links对权限有不同的理解。
创建文件时,比如:#touch myfile。系统不会自动地设置执行权限位。这是出于加强系统安全的考虑。必须手工修改这一权限位:后面讲到umask命令时,你就会明白为什么没有获得执行权限。然而,你可以针对目录设置执行权限位,但这与文件执行权限位的意义有所不同,这一点我们将在后面讨论。
对于文件属主来说,在只有读权限位被置位的情况下,仍然可以通过文件重定向的方法向该文件写入。过一会儿我们就会看到,能否删除一个文件还依赖于该文件所在目录权限位的设置。
chmod命令的一般格式为:
chmod [who] operator [permission] filename
who的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户)。
operator的含义:
+ 增加权限。
- 取消权限。
= 设定权限。
permission的含义:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组set-ID。
t 粘性位*。
l 给文件加锁,使其他用户无法访问。
u,g,o 针对文件属主、同组用户及其他用户的操作。
*在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现
“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个同组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。
如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)。不过由于当今的内存价格如此之低,大可不必理会文件的“ t”的使用。
还可以通过使用- R选项连同子目录下的文件一起设置:
chmod -R 664 /usr/local/home/dave/*
这样就可以一次将/usr/local/home/dave目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和同组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。
这种权限位近年来成为一个棘手的问题。很多系统供应商不允许实现这一位,或者即使它被置位,也完全忽略它的存在,因为它会带来安全性风险。那么人们为何如此大惊小怪呢?
suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。于是,如果根用户的某一个脚本设置了这样的权限,那么其他普通用户在执行它的期间也同样具有根用户的权限。同样的原则也适用于guid,执行相应脚本的用户将具有该文件所属用户组中用户的权限。
设置suid/guid的目的在于让其他用户能执行,但是用不用知道用户的密码.
一下可以查找具有suid的文件
[root@Meil89
sbin]# ls -l |grep '^...s'
-r-s--x--x 1 root
root 7088 Feb 11 2003 pam_timestamp_check
-r-sr-xr-x 1 root
root 119528 Feb 11 2003 pwdb_chkpwd
-r-sr-xr-x 1 root
root 17220 Feb 11 2003 unix_chkpwd
如果希望设置suid,那么就将相应的权限位之前的那一位设置为4;如果希望设置guid,那么就将相应的权限位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。
还可以使用符号方式来设置suid/guid。如果某个文件具有这样的权限: rwx r-x r- x,那么
可以这样设置其suid:
chmod u+s
<filename>
于是该文件的权限将变为: rws r-x r-x
在查找设置了suid的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。它表示相应的执行权限位并未被设置,这是一种没有什么用处的suid设置,可以忽略它的存在。
注意,chomod命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。
在改变一个文件的所有权时,相应的suid也将被清除,这是出于安全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了。
找出用户所属的组:
$ groups
meil root wheel
mail
[meil@Meil89
meil]$ groups bbca
bbca : bbca
wheel
$
$ id
uid=903(meil)
gid=903(meil) groups=903(meil),0(root),10(wheel),12(mail)
# chown bin
sampsoft
# chgrp bin sampsoft
# chown
bin.bin sampsoft