SDB:用户和组
目录
概述
本文主要是讲用户和组的一些知识。
首先我们来了解一些用户和组的基础知识。比如什么是用户账户和组账户,用户和组的信息如何保存。 然后来讲一些简单用户和组管理,比如如何添加用户和组如何删除用户和组。 再然后,说一说sudo用户组,因为这个组被用的最多也最被人误解。 最后给一些比较琐碎的系统账户方面的信息。
一些基础知识
概念
什么是用户账户?你可以很简单的理解它就和银行账户一样,有了银行账户你才可以存钱取钱,同理,你有了用户账户才可以使用你的linux系统。 当然,不是说你有了一个银行账户银行就是你的了,里面的钱你随便拿。银行有很多的用户,银行提供的服务对每个用户都是不同的,比如你是学生,没有收入你不能办信用卡。同样的,linux作为一个多用户的操作系统也有很多的用户账户,它也会有一些权力的限制。 而用户组则是它用来来简化管理过程的工具,就像银行会细分用户对用户提供不同的服务以求利益最大化一样。不同的是linux的用户管理不是为了赚钱,而是为了安全。
我们大致可以把账户为这样三种:root账户(根账户),系统账户,用户账户。而每一个账户都会属于一个组。但不是说只能属于一个组账户。
root账户
root账户可以完全的,不受约束的控制系统,以至于可以运行命令来完全破坏系统。linux的哲学假定用户知道自己要做什么,用户是高于一切的,即使他的命令会完全破坏系统,这是和windows很不同的一点,windows通常会设法自我保护。所以使用root账户时要格外谨慎。
系统账户
系统账户是对系统特定组件进行操作所需要的那类账户。或者说他们有对系统特定组件进行操作的权利。有时候我们希望用较小的权利去运行系统上启用的服务,而不是使用root身份去执行,我们就用到他们。但他们通常是不可登录的,事实上,我发现他们其实是可以加入的用户组。在这样的组里面我们可以获得对系统特定组件操作权利,我们可以通过加入这些组来完成一些特殊的工作。下面我会再次提到系统账户的。
用户账户
用户账户为用户和用户组提供对系统的交互式访问。
管理文件
系统上有三个主要的文件用来储存用户信息和管理用户。
- /etc/passwd 为系统识别已授权的账户
- /etc/shadow 保存相应帐号加密后的口令
- /etc/group 存放组账户的信息
下面我们分别来看看这三个文件。
/etc/passwd
我们可以用cat命令来查看这个文件,你可以在终端运行
cat /etc/passwd
你会看到以下内容(先大致的浏览一下它,等会我们还会用到它)
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash avahi:x:487:486:User for Avahi:/var/run/avahi-daemon: /bin/false bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:Daemon:/sbin:/bin/bash dhcpd:x:491:65534:DHCP server daemon:/var/lib/dhcp:/bin/false dnsmasq:x:488:65534:dnsmasq:/var/lib/empty:/bin/false fetchmail:x:481:2:mail retrieval daemon:/var/lib/fetchmail:/bin/false ftp:x:40:49:FTP account:/srv/ftp:/bin/bash ftpsecure:x:482:65534:Secure FTP User:/var/lib/empty:/bin/false games:x:12:100:Games account:/var/games:/bin/bash gdm:x:480:480:Gnome Display Manager daemon:/var/lib/gdm:/bin/false icecream:x:492:489:Icecream Daemon:/var/cache/icecream:/bin/false lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash messagebus:x:499:499:User for D-Bus:/var/run/dbus:/bin/false mysql:x:60:496:MySQL database admin:/var/lib/mysql: /bin/false nagios:x:495:493:User for Nagios:/var/lib/nagios:/bin/false named:x:44:44:Name server daemon:/var/lib/named:/bin/false news:x:9:13:News system:/etc/news:/bin/bash nginx:x:489:487:user for nginx:/var/lib/nginx:/bin/false nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash ntp:x:74:495:NTP daemon:/var/lib/ntp:/bin/false polkitd:x:485:485:User for polkitd:/var/lib/polkit:/sbin/nologin postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false pulse:x:483:482:PulseAudio daemon:/var/lib/pulseaudio:/sbin/nologin quagga:x:496:494:Quagga routing daemon:/var/run/quagga:/usr/bin/false radvd:x:490:2:Router ADVertisement Daemon for:/var/lib/empty:/bin/false root:x:0:0:root:/root:/bin/bash rtkit:x:484:484:RealtimeKit:/proc:/bin/false shellinabox:x:493:490:user for shellinabox:/var/lib/shellinabox:/bin/false squid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/false sshd:x:498:498:SSH daemon:/var/lib/sshd:/bin/false statd:x:486:65534:NFS statd daemon:/var/lib/nfs:/sbin/nologin tftp:x:494:491:TFTP account:/srv/tftpboot:/bin/false usbmux:x:497:65534:usbmuxd daemon:/var/lib/usbmuxd:/sbin/nologin uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash webyast:x:479:479:User for WebYaST:/var/lib/webyast:/bin/false wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false user:x:1000:100:user:/home/user:/bin/bash
我们选取一条来分析,就是最后一条。
user:x:1000:100:user:/home/user:/bin/bash
- user: 用户名
- x: 加密的口令,因为这里使用了隐式口令,所以只有一个x。为了安全,具体的口令被转移到了/etc/shadow下
- 1000: 用户ID(UID),系统是通过号码来别用户的。
- 100: 组ID(GID),账户所属的首要的或默认的组。这里只有一个,但是不是说用户只可以有一个用户组。
- user: 这里是和用户名一样的,但是实际上这个字段可以保存用户名,电话以及任何可读的信息,也可以是任何内容,除了冒号,因为它要用来分割字段
- /home/user user用户的主目录
- /bin/bash user用户使用的shell
再回顾一遍上面的输出,我们稍微仔细地看以下。root账户的ID是0。可以这样讲,ID是0的账户是root账户,你可以把这个ID给别的账户,那么它就是root账户了。当然我不会推荐你这样做。1 ~ 499 的帐号一般是系统帐号。500以后就是一般的用户的帐号。
/etc/shadow
我们用cat命令来查看这个文件
cat /etc/shadow
这里我就取一例
user:$6$ZK8Pa1rdFXvY$V287wVawAbP.BxlgRFGydm/aamh3qOiCkVEXBDPJAjLHrTQ06nmClsJi1g2bA6d1Y3hMtYX0MO4vVxO4xpP8j/:15850:0:99999:7:::
这里按照字段来解释
- user: 用户名
- $6$ZK8Pa1rdFXvY$V287wVawAbP.BxlgRFGydm/aamh3qOiCkVEXBDPJAjLHrTQ06nmClsJi1g2bA6d1Y3hMtYX0MO4vVxO4xpP8j/:加密后的口令
- 15850:从1970年1月1日到指令被修改的天数
- 0: 用户可以再次修改指令所要的最少天数(这个很有用!)
- 99999: 口令保持有效的最大天数
- 7:口令到期前警告用户额天数
- :通常表示账户可以连续不活动的天数
- :从1970年1月1日到账户到期的天数
- :保留字段
/etc/group
同样的可以用cat查看
cat /etc/group
或者也可以用vim
vim /etc/group
我们从输出中举一例
users:x:100:user1,user2
按字段来看下面内容
- users: 组名
- x: 用户组口令
- 100: 组ID
- user1,user2: 这个组的用户
管理用户和组
当然,你可以直接在上面的三个文件里修改参数,但是这很明显不科学。 我们一般用命令行来改主要的命令有下面这些
useradd 向系统中添加账户 usermod 修改账户属性 userdel 从系统中删除账户 groupadd 向系统中添加组 groupmod 修改组的属性 groupdel 从系统中删除组
具体的内容可以通过man来查询,比如
man useradd
稍微讲一下useradd这个命令参数
- -c 注释
- -d 账户主目录
- -e 账户终止日期,用yyyy-mm-dd或mm/dd/yy的形式
- -f 在账户不能用之前可以不活动的天数
- -g 默认组
- -G 一列用冒号隔开的次要组
- -m 如果主目录不在,创建主目录
- -s 用户用的shell
- -u 用户ID
具体结构如下
useradd -c comment -d home directory -e expiration date -f inactive days -g primary group -G secondary groups -m -s shell -u user id accountname
在openSUSE下我们还有一个非常方便的图形界面,
YaST -> 安全与用户 -> 用户和组管理
在这里你可以完成大部分的工作。
sudo组的管理
随意的使用root帐号是危险的,特别在多用户的情况下,我们一般用sudo来替代,这样更加安全。sudo的用法非常简单,只要在要运行的命令前添加sudo即可。但是,只有sudo组里的用户才可以使用sudo命令。
用下面命令可以打开sudo组的配置文件,文件的路径是/etc/sudoers(注意需要root的)
#visudo
会看到以下的内容。
Defaults !insults ## ## Uncomment to enable logging of a command's output, except for ## sudoreplay and reboot. Use sudoreplay to play back logged sessions. # Defaults log_output # Defaults!/usr/bin/sudoreplay !log_output # Defaults!/sbin/reboot !log_output
## In the default (unconfigured) configuration, sudo asks for the root password. ## This allows use of an ordinary user account for administration of a freshly ## installed system. When configuring sudo, delete the two ## following lines: Defaults targetpw ALL ALL = (ALL) ALL
## ## Runas alias specification ##
## ## User privilege specification ## root ALL = (ALL) ALL
注意这一段
Defaults targetpw ALL ALL = (ALL) ALL
先看第一行
我们知道sudo是暂时转化为root身份来执行命令的,其实他是可以带参数的,比如
sudo -u user
这时你就是以user的身份运行命令了 Defaults targetpw的意思是你在sudo之后要输入的密码是你要转化的对象的。 如果改为
Defaults rootpw
则在sudo之后会要求输入root密码不管你是不是转化为root身份运行 如果把这句话注释掉,则会要求输入用户自己的密码
再看第二行,我么一个个解释。
- 第一个ALL指所有用户
- 第二个ALL指所有主机
- 第三个括号里的ALL指的是以什么样的身份
- 第四个ALL指的是命令
简单举个例子,在末尾添加
user ALL=(root) /sbin/shutdown
这个命令的意思就是说user用户可以在所有的主机上以root的身份运行/sbin里的shutdown命令
其实还可以跳过密码运行命令,具体实现如下:
user ALL=(root) NOPASSWD:/sbin/shutdown
看上面的配置会发现默认所有用户都可以使用sudo
一些系统帐号的简介
一些系统帐号事实就是一些附加组,你可以通过YaST -> 安全与用户 -> 用户和组管理 里选定某个用户后点编辑,再点细节,就可以看到附加的组了。 举个例子,比如你要使用virtualbox,他就会提示你要你加入vboxusers组,这时你只要在附加组里面勾选就可以了。
下面来介绍一下一些简单的附加组。
- games 在各个组里的用户可以存储独立的高分值在/var/lib中
- news 标准用户的新闻组
- tty 拥有访问开头是/dev/tty的终端设备的权利。如程序需要访问到/dev/tty开头的设备,就可以加入此组
- disk 此组有写访问的所有原始磁盘设备的权利
- lp 此组可以访问打印机而不用root
- bin和sys 据说是由于历史原因,如果不在这些组下一些程序无法运行
- adm 日志文件(在/var/log)中的大多数是只有组内的人可读。您可以添加需要监测这些日志文件的用户谁到该组。