1. Linux 帐号与用户组
2. Linux 帐号管理
2.1 新增与删除用户:useradd, useradd 相关配置文件, passwd, chage, usermod, userdel
■ 使用 useradd 新建用户帐号
useradd - 创建一个新用户或更新默认新用户信息
用法:
useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户账号名
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :后面接的那个组名就是 initial group 。该群组的 GID 会被放置到 /etc/passwd 的第四个字段。
-G :后面接的组名是这个账号还可以加入对用户组。这个参数会修改 /etc/group 内的相关数据。
-M :强制!不要建立用户主目录(系统账号默认值)。
-m :强制!要建立用户主目录(一般账号默认值)。
-c :这个就是 /etc/passwd 第五栏的说明内容,可以随便设置。
-d :指定某个目录为主目录,而不要使用默认值。务必使用绝对路径。
-r :建立一个系统账号,这个账号的 UID 会有限刢 (参考 /etc/login.defs)。
-s :后面接一个 shell ,若没有指定则默认是 /bin/bash 。
-e :后面接一个日期,格式为 “YYYY-MM-DD” ,此项目可写入 shadow 第八字段, 即帐号失效日期的设置选项。
-f :后面接 shadow 的第七字段选项,指定密码是否会失效。0为立刻失效, -1 为永远不失效(密码只会过期而强制登录时重新设置) 。
范例:
[root@online ~]# useradd git
[root@online ~]# ll -d /home/git
drwx------. 3 git git 78 4月 22 17:55 /home/git
[root@online ~]# grep git /etc/passwd /etc/shadow /etc/group
/etc/passwd:git:x:1001:1001::/home/git:/bin/bash
/etc/shadow:git:!!:17643:0:99999:7:::
/etc/group:git:x:1001: <== 默认会建立一个与帐号完全一样的用户组
其实系统已经帮我们设置好非常多的默认值了,所以我们可以简单地使用 “useradd 账号” 来创建用户即可。CentOS 这些默认值主要会帮我们处理几个项目:
● 在 /etc/passwd 里面建立一行与帐号相关的数据,包括建立 UID/GID/主目录等;
● 在 /etc/shadow 里面将此帐号的密码相关参数填入,但是尚未有密码;
● 在 /etc/group 里面加入一个与帐号名称完全一样的组名;
● 在 /home 下建立一个与帐号同名的目录作为用户主目录,且权限为 700
由于在 /etc/shadow 内只会有密码参数而不会有加密过的密码数据,因此在建立用户帐号时,还需要使用 “passwd 帐号” 来设置密码才算是完成用户建立流程。
如果有特殊需要而改变用户帐号的默认参数,就要使用命令选项参数来改变帐号创建过程。
范例:
useradd -u 700 -g users git2
范例:建立一个系统帐号
useradd -r git3
ll -d /home/git3
ls: /home/git3: No such file or directory <==不会建立主目录
系统帐号的 UID/GID 小于 1000。同时,由于系统账号主要是用来运行系统所需服务, 所以系统账号默认都不会主动创建主目录。
■ useradd 参考文件
-----------------------------------------------------------------------------------------------------------------------------------------
useradd 的默认值可以使用下面的方法显示出来:
[root@online ~]# useradd -D
GROUP=100 <==默认的用户组
HOME=/home <==默认主目录的基准目录(basedir)
INACTIVE=-1 <==密码失效日期, shadow 内第七列
EXPIRE= <==帐号失效日期, shadow 内第八列
SHELL=/bin/bash <==默认的 shell
SKEL=/etc/skel <==用户主目录的内容数据参考目录
CREATE_MAIL_SPOOL=yes <==是否创建用户邮箱
■ passwd
-----------------------------------------------------------------------------------------------------------------------------------------
使用 useradd 建立帐号之后,默认情况下,该帐号暂时被封锁,也就是说,该帐号无法登录。需要设置密码方能使用。
用法:
passwd [--sdtin] <==所有人均可使用来改自己的密码
passwd [-l] [-u] [--sdtin] [-S] [-n 天数] [-x 天数] [-w 天数] [-i 日期] 账号 <==root 功能
选项与参数:
--stdin :可以通过来自于一个标准输入,作为密码,对 shell script 有帮助
-l :是 Lock 的意思,会将 /etc/shadow 第二列最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思。
-S :列出密码相关参数,即 shadow 文件的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多少天不可修改密码
-x :后面接天数,shadow 的第 5 字段,多少天内必须修改密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接日期,shadow 的第 7 字段,密码失效日期
范例:root 给 git 设置密码
[root@online ~]# passwd git
通过 root 设置密码, root 可以设置各式各样的密码,系统几乎一定会接受!
范例:给自己设置密码
[git@online ~]$ passwd <==后面不接帐号
要注意的是,一般账号给自己设置密码,要经过检验,不合规范通不过。密码规范是非常严格,尤其新的 distributions 大多使用 PAM 模块进行密码检验,
包括太短、密码与帐号相同、密码为字典常见字符串等,都会被 PAM 模块检查出来从而拒绝修改。
这个管理机制写在 /etc/pam.d/passwd 中。该文件与密码有关的检验模块使用 pam_cracklib.so,这个模块会检验密码相关的信息,并取代
/etc/login.defs 内的 PASS_MIN_LEN 的设置。
范例:使用 standard input 修改用户密码
[root@online ~]# echo "abc543CC" | passwd --stdin git
■ chage - 更改用户密码过期信息
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
[root@online ~]# chage [-ldEImMW] 帐号
选项与参数:
-l :列出该帐号的详绅密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(账号失效日期),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效天数)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要修改)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告天数)
chage 有一个很不错的功能,如果想要 “用户在第一次登入时,强制他们一定要更改密码后才能够使用系统资源”,可以使用如下方法处理。
范例:建立一个名为 agetest 的帐号,该帐号第一次登录时使用默认密码,但必须要更改密码后,使用新密码登录系统后才能使用 bash 环境
[root@online ~]# useradd agetest
[root@online ~]# echo "agetest" | passwd --stdin agetest
[root@online ~]# chage -d 0 agetest
■ usermod - 修改一个用户账户
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
[root@online ~]# usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接帐号的说明,即 /etc/passwd 第五栏的说明列,可以加入一些帐号说明;
-d :后面接帐号的主目录,即修改 /etc/passwd 的第六列;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据。
-f :后面接天数,为 shadow 的第七字段;
-g :后面接初始用户组,修改 /etc/passwd 的第四个字段,即 GID 字段;
-G :后面接次要用户组,修改这个用户能够支持的用户组,修改的是 /etc/group ;
-a :不 -G 合用,可增加次要用户组的支持而非设置;
-l :后面接帐号名称。即修改帐号名称, /etc/passwd 第一栏;
-s :后面接 Shell 的实际文件名,例如 /bin/bash 或 /bin/csh 等等;
-u :后面接 UID 数字,即 /etc/passwd 第三列的资料;
-L :暂时将用户密码冻结,让他无法登录。其实仅改 /etc/shadow 密码列。
-U :将 /etc/shadow 密码列的 ! 拿掉,解冻。
■ userdel - 删除用户账户和相关文件
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
userdel [-r] username
选项与参数:
-r : 用户主目录中的文件将随用户主目录和用户邮箱一起删除。在其它文件系统中的文件必须手动搜索并删除。
2.2 用户功能
---------------------------------------------------------------------------------------------------------------------------------------------
■ finger — 用户信息查找程序
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
finger [-s] username
选项与参数:
-s :仅列出用户的帐号、全名、终端机代号与登入时间等等;
范例:
[root@online ~]# finger git
Login: git Name:
Directory: /home/git Shell: /bin/bash
Last login 日 4月 22 18:50 (CST) on pts/0
No mail.
No Plan.
■ chfn - 改变自己的 finger 信息
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
chfn [-foph] [账号名]
选项与参数:
-f :后面接完整名;
-o :办公室房间号码;
-p :办公室的电话号码;
-h :家里的电话号码。
范例:
[git@online ~]$ chfn
Changing finger information for git.
名称 []:
■ chsh - 改变登录 shell
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
chsh [-ls]
选项与参数:
-l :列出当前系统上可用的 shell ,其实就是 /etc/shells 的内容
-s :修改自己的 Shell
范例:
[git@online ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
■ id - 显示真实和有效的 UID 和 GID
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
id [username]
2.3 新增与删除用户组
---------------------------------------------------------------------------------------------------------------------------------------------
■ groupadd - 创建一个新的用户组
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
[root@online ~]# groupadd [-g gid] [-r] 组名
选项与参数:
-g :后面接某个特定的 GID ,用于直接指定某个 GID;
-r :建立系统用户组,与 /etc/login.defs 内的 GID_MIN 有关。
范例:
[root@online ~]# groupadd group1
■ groupmod - modify a group definition on the system
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
[root@online ~]# groupmod [-g gid] [-n group_name] 群组名
选项与参数:
-g :修改既有的 GID 数字
-n :修改既有的组名
■ groupdel - 删除一个用户组
-----------------------------------------------------------------------------------------------------------------------------------------
用法:
[root@online ~]# groupdel [groupname]
■ gpasswd:群组管理员功能
-----------------------------------------------------------------------------------------------------------------------------------------
# 系统管理员(root)做的操作:
用法:
[root@online ~]# gpasswd groupname
[root@online ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@online ~]# gpasswd [-rR] groupname
选项与参数:
:若没有任何参数,表示给 groupname 设置密码(/etc/gshadow)
-A :将 groupname 的主控权交由后面的用户管理(该组的管理员)
-M :将某些帐号加入这个组中
-r :将 groupname 的密码移除
-R :让 groupname 的密码失效
# 组管理员(Group administrator)做操作:
用法:
[someone@www ~]$ gpasswd [-ad] user groupname
选项与参数:
-a :将某用户加入到 groupname 这个组中
-d :将某用户移出 groupname 这个组。
4. 使用者身份切换
---------------------------------------------------------------------------------------------------------------------------------------------
可能有如下几个原因:
● 安全考虑:使用一般帐号,日常操作的好习惯。尽量以一般身份使用者来操作 Linux 日常作业,等到需要设置系统环境时,才变换身份 root 来进行系统
管理,相对安全。
● 用较低权限启动系统服务:相对于系统安全,有时必须以某些系统帐号来进行程序的执行。例如, apache 服务器 httpd, 以 apache 用户启动,这样,
如果系统被攻破,也只是拥有 apache 用户权限,系统不至于损坏。
● 软件本身的限制:如 telnet 程序,该程序默认不允许以 root 身份登录。 ssh 也可设置为拒绝 root 用户登录。
由于上述考虑,所以使用一般帐号登录系统,在需要时才转换为 root 帐户操作。
主要有两种方式:
□ su - :命令直接将身份变成 root 帐户,这个命令需要 root 密码
□ sudo command:执行 root 的命令串,需要用户密码
4.1 su 命令
---------------------------------------------------------------------------------------------------------------------------------------------
语法格式:
su [-lm] [-c 指令] [username]
选项与参数:
------------------------------------------------------------------------------------------------------------------------------------------
- :单纯使用 - 如『 su - 』代表使用 login-shell 的环境变量读取方式登录系统;若 username 没有加上去,则代表切换为 root 身份。
-l :与 - 类似,但后面需要加欲切换的用户账号!也是 login-shell 方式。
-m :-m 与 -p 是一样,表示『使用当前的环境变量设置,而不读取用户的配置文件』
-c :仅进行一次指令,所以 -c 后面可以加上指令
su命令与用户名之间用一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
单纯使用『 su 』切换为 root 身份,读取环境变量方式为 non-login shell 。这种方式很多原来的变量不会给改变。
切换为其他用户身份后,如果想退出该身份,需要使用 exit 命令。
如果只想执行一次指令,执行完毕之后恢复本来身份,可以使用 -c 选项,其后跟要执行的指令。
4.2 sudo 命令
---------------------------------------------------------------------------------------------------------------------------------------------
sudo 的执行仅需要自己的密码,甚至可以设定不需要密码执行 sudo. 由于 sudo 以其他用户的身份执行命令(通常使用 root 身份执行),因此并非所有的用户都
能执行 sudo, 而只有规范到 /etc/sudoers 文件内的用户才能执行 sudo .
语法格式:
sudo [-b] [-u 新用户帐号]
选项与参数:
------------------------------------------------------------------------------------------------------------------------------------------
-b : 将后续的指令放到后台运行,而不对当前 shell 产生影响
-u : 后面可接欲切换的用户帐号,若无此项,则代表切换为 root 身份。
-h 列出帮助信息
-l 列出当前用户可执行的命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-p 更改询问密码的提示语
◆ visudo 与 /etc/sudoers
------------------------------------------------------------------------------------------------------------------------------------------
除了 root 之外的帐号,若要使用 sudo 执行属于 root 权限的命令,则 root 需要先使用 visudo 修改 /etc/sudoers ,让该帐号能够使用全部或部分 root
的指令功能。为什么要使用 visudo 呢,因为 /etc/sudoers 是有设置语法的,如果设置语法错误会造成无法使用 sudo 的不良后果。使用 visudo 修改,在
退出编辑器时,系统会检验 /etc/sudoers 的语法是否正确。
Ⅰ 单一用户可执行所有 root 指令, sudoers 文件语法:
-------------------------------------------------------------------------------------------------------------------------------------
[root@online ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL <==找到这一行,大约在 92 行左右
devalone ALL=(ALL) ALL <==这一行是新增的
....(后面省略)....
语法说明:
使用者帐号 登录者的来源主机名=(可切换的身份帐号) 可执行的指令
root ALL=(ALL) ALL <==这是默认值
四个字段含义:
① 使用者帐号:系统的哪个账户可以使用 sudo 命令。默认只有 root 。
② 登录者的来源主机名:使用者可以从哪部主机登录到这部 Linux 主机,ALL 表示可以来自任何一部网络主机
③ 可切换的身份帐号:这个使用者帐号可以切换为哪个帐户来执行命令, ALL 表示可以切换成任何帐户。
④ 可执行的指令:可用该身份执行什么命令,务必使用绝对路径填写命令路径。 ALL 表示可以执行任何命令。
ALL 是个特殊的关键字,代表任何身份,任何主机,任何命令。
Ⅱ 利用分组以及免密码功能处理 visudo:
-------------------------------------------------------------------------------------------------------------------------------------
[root@online ~]# visudo
....(前面省略)....
%wheel ALL=(ALL) ALL <==大约在 100 行左右
# 在最左边加上 % ,代表后面接的是一个『用户组』,改完保存退出。
....(后面省略)....
上面的定义表示任何加入 wheel 用户组的帐户都可以使用 sudo 切换任何身份执行任何命令。
可以使用 usermod 修改用户支持的组。
设置无密码登录:
%devalone ALL=(ALL) NOPASSWD: ALL <==大约在 103 行左右
Ⅲ 有限的指令操作:
-------------------------------------------------------------------------------------------------------------------------------------
如果想要让用户只能执行部分系统任务,比如让 myuser1 只能以 root 身份修改其他用户密码,可以这样做:
[root@online ~]# visudo
myuser1 ALL=(root) /usr/bin/passwd <==最后的命令务必使用绝对路径
这条指令 myuser1 能改变所有人的密码,包括 root 密码,这是不应该的。
修改如下:
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root <== ! 表示不可执行。
含义是:myuser1 用户可以执行『 passwd 任意字符』, 但是『 passwd 』与『 passwd root 』这两个指令例外。如此一来 myuser1 就无法改变 root
密码了。
Ⅳ 通过别名设置 visudo
-------------------------------------------------------------------------------------------------------------------------------------
visudo 的别名可以是:指令别名、帐户别名、主机别名等。
假设 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的密码管理员 sudo 列表中,可以建立一个帐户别名 ADMPW, 然后将这个名称处理一下即可。
命令别名为 ADMPWCOM, 处理方式如下:
[root@online ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
通过 User_Alias 建立新帐号,帐号名称一定使用大写。包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符。
ADMPW 代表后面接的实际帐号,ADMPWCOM 后面接的是实际执行的命令。
Ⅴ sudo 的时间间隔问题:
-------------------------------------------------------------------------------------------------------------------------------------
如果使用同一帐号在短时间内重复操作 sudo 来运行命令,在第二次执行 sudo 时,并不需要输入密码, sudo 会正确执行。两次执行 sudo 的间隔
在 5 分钟内,那么再次执行 sudo 时不需要再次输入密码。如果两次 sudo 操作的间隔时间超过 5 分钟,需要重新输入一次密码。
Ⅵ sudo 搭配 su 的使用方式:
-------------------------------------------------------------------------------------------------------------------------------------
sudo 搭配 su , 将身份转换为 root, 并且使用自己的密码。
可以这样做:
[root@online ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -
上述 pro1, pro2, pro3, myuser1 四个人,只要输入:
sudo su -
并输入自己的密码后,立刻变成 root 身份。