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
  1. user: 用户名
  2. x: 加密的口令,因为这里使用了隐式口令,所以只有一个x。为了安全,具体的口令被转移到了/etc/shadow下
  3. 1000: 用户ID(UID),系统是通过号码来别用户的。
  4. 100: 组ID(GID),账户所属的首要的或默认的组。这里只有一个,但是不是说用户只可以有一个用户组。
  5. user: 这里是和用户名一样的,但是实际上这个字段可以保存用户名,电话以及任何可读的信息,也可以是任何内容,除了冒号,因为它要用来分割字段
  6. /home/user user用户的主目录
  7. /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:::


这里按照字段来解释

  1. user: 用户名
  2. $6$ZK8Pa1rdFXvY$V287wVawAbP.BxlgRFGydm/aamh3qOiCkVEXBDPJAjLHrTQ06nmClsJi1g2bA6d1Y3hMtYX0MO4vVxO4xpP8j/:加密后的口令
  3. 15850:从1970年1月1日到指令被修改的天数
  4. 0: 用户可以再次修改指令所要的最少天数(这个很有用!)
  5. 99999: 口令保持有效的最大天数
  6. 7:口令到期前警告用户额天数
  7.  :通常表示账户可以连续不活动的天数
  8.  :从1970年1月1日到账户到期的天数
  9.  :保留字段

/etc/group

同样的可以用cat查看

cat /etc/group

或者也可以用vim

vim /etc/group

我们从输出中举一例

users:x:100:user1,user2

按字段来看下面内容

  1. users: 组名
  2. x: 用户组口令
  3. 100: 组ID
  4. 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)中的大多数是只有组内的人可读。您可以添加需要监测这些日志文件的用户谁到该组。