/etc/sudoers
/etc/sudoers
用于管理 Linux 系统上特权操作的访问控制列表(ACL)。该文件指定了哪些用户、组或主机可以执行特权命令,以及他们可以执行哪些命令。
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for the details on how to write a sudoers file.
#
# Override builtin defaults
Defaults syslog=auth,timestamp_timeout=300,!set_logname
Defaults:admin lecture=always
Defaults:admin lecture_file=/etc/sudoers.lecture
Defaults:admin passwd_timeout=0.5
Defaults:hwnoc !requiretty
# Host alias specification
# Cmnd alias specification
Cmnd_Alias SHELLS = /bin/sh,/bin/ash,/bin/bsh,/bin/bash,/bin/csh, \
/bin/ksh,/bin/rsh,/bin/tcsh,/bin/zsh
Cmnd_Alias VIETC = /usr/sbin/visudo,/usr/sbin/vipw,/usr/sbin/vigr
Cmnd_Alias USERADD = /usr/sbin/useradd,/usr/sbin/adduser
Cmnd_Alias SUPERMIT = !/usr/bin/sudo *,!/bin/su *,/bin/su -c*,/bin/su [a-zA-Z0-9]*,!/bin/su *root*
Cmnd_Alias SUDOEXEC = /bin/sh [/~.a-zA-z0-9]*, /bin/sh -c*, \
/bin/ash [/~.a-zA-z0-9]*, /bin/ash -c*, \
/bin/bsh [/~.a-zA-z0-9]*, /bin/bsh -c*, \
/bin/bash [/~.a-zA-z0-9]*, /bin/bash -c*, \
/bin/csh [/~.a-zA-z0-9]*, /bin/csh -c*, \
/bin/ksh [/~.a-zA-z0-9]*, /bin/ksh -c*, \
/bin/rsh [/~.a-zA-z0-9]*, /bin/rsh -c*, \
/bin/tcsh [/~.a-zA-z0-9]*, /bin/tcsh -c*, \
/bin/zsh [/~.a-zA-z0-9]*, /bin/zsh -c*
## settings from ali local
# default
%users ALL=(users) ALL
root ALL=(ALL) ALL
Cmnd_Alias WHITELIST1 = /bin/grep
mysql ALL=(ALL) NOPASSWD:WHITELIST1
Cmnd_Alias WHITELIST2 = /usr/bin/crontab -l -u admin,/usr/bin/crontab -u admin -l
guest ALL=(ALL) NOPASSWD:WHITELIST2
appadmin ALL=(ALL) NOPASSWD:ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC,!USERADD
%tbops ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC
%tbpe ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC
%tbdba ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC
%tbnoc ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC,!USERADD
%tbscm ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC,!USERADD
%tbdev ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC,!USERADD
%tbtest ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC,!VIETC,!USERADD
# Compatible with the /home/staragent/plugins/osteam.src/osteam.cur/account.sh
Cmnd_Alias ALINOC_CMD = /usr/bin/kill,/usr/sbin/shutdown,/usr/sbin/halt,/usr/sbin/reboot,/bin/sh,/bin/ash,/bin/bsh,/bin/bash,/bin/csh,/bin/ksh,/bin/rsh,/bin/tcsh,/bin/zsh,/usr/bin/passwd,/usr/bin/chsh,/usr/bin/chfn,/usr/bin/su,/bin/su,/usr/sbin/su,/usr/sbin/visudo,/usr/sbin/vipw,/usr/sbin/vigr,/usr/sbin/useradd,/usr/sbin/adduser,/user/sbin/userdel,/user/sbin/usermod,/user/sbin/userpasswd,/user/sbin/groupadd,/user/sbin/groupdel,/user/sbin/groupmod,/usr/bin/sudo*,/bin/su*,/bin/su [a-zA-Z0-9]*,/bin/su *root*,/bin/chmod,/bin/chown,/bin/chattr,/bin/rm,/bin/rmdir,/sbin/rmmod,/sbin/insmod
hwnoc ALL=(ALL) NOPASSWD:ALL,SUPERMIT,!VIETC,!USERADD,!ALINOC_CMD
admin ALL=(ALL) NOPASSWD:ALL,SUPERMIT,!VIETC,!USERADD
%admin ALL=(ALL) NOPASSWD:ALL,SUPERMIT,!VIETC,!USERADD
Defaults
定义默认信息,包括默认的用户、默认的命令、默认的主机等。
格式:Defaults parameter=value
如文件中的Defaults syslog=auth,timestamp_timeout=300,!set_logname
这条规则意味着当用户使用 sudo 命令时,sudo 命令的执行信息将被记录到系统的安全日志中,并且超时时间为 5 分钟,而且不会记录当前用户的登录名信息。
syslog
:指定日志级别和设备,这里的 auth 表示将 sudo 命令的执行信息记录在系统的安全日志中。timestamp_timeout
:指定 sudo 命令的超时时间,这里是 300 秒,也就是 5 分钟。!set_logname
:表示禁用记录当前用户的登录名信息。格式:Defaults:admin parameter=value
# 针对admin用户设置
Defaults:admin lecture=always
Defaults:admin lecture_file=/etc/sudoers.lecture
Defaults:admin passwd_timeout=0.5
lecture:指定 sudo 命令的提示信息,这里是 always,表示每次使用 sudo 命令时都会提示用户一条信息。
lecture_file:指定 sudo 命令的提示信息来源,这里是 /etc/sudoers.lecture,表示提示信息将从该文件中读取。
passwd_timeout:指定密码的超时时间,这里是 0.5,表示在输入密码后 0.5 秒内必须使用 sudo 命令,否则需要重新输入密码。
# 意味着当名为 admin 的用户使用 sudo 命令时,每次都会收到一条来自 /etc/sudoers.lecture 文件的提示信息,提醒用户操作的风险和注意事项。另外,用户必须在输入密码后 0.5 秒内使用 sudo 命令,否则需要重新输入密码。
Defaults:hwnoc !requiretty
!requiretty:表示不要求用户在 tty 控制台上使用 sudo 命令。
# 通常情况下,sudo 命令要求用户必须在 tty 控制台上输入密码,这样可以确保用户是在本地执行命令,而不是在远程机器上执行。然而,在某些情况下,用户可能需要在无 tty 的情况下使用 sudo 命令,如通过 ssh 等远程连接执行命令。这时就需要通过 !requiretty 参数来禁用 tty 控制台的要求。因此,这条规则意味着当名为 hwnoc 的用户使用 sudo 命令时,不需要在 tty 控制台上输入密码。
Cmnd_Alias
定义命令别名,将一个或多个命令映射到一个别名。
格式:Cmnd_Alias aliasname=command1,command2,...
与此类似的还有:
User_Alias
:定义用户别名,将一个或多个用户映射到一个别名。
Runas_Alias
:定义运行用户别名,将一个或多个运行用户映射到一个别名。
Host_Alias
:定义主机别名,将一个或多个主机映射到一个别名。
admin ALL=(ALL) NOPASSWD:ALL,SUPERMIT,!VIETC,!USERADD
解释:
因此,这条规则意味着用户 admin 在所有主机上可以使用 sudo 命令以任何用户身份执行任何命令,而且不需要输入密码。此外,用户 admin 可以使用 SUPERMIT 命令别名,但是不能使用 VIETC 和 USERADD 命令别名,以保证系统的安全性和稳定性。
%tbops ALL=(ALL) ALL,SUPERMIT,!SHELLS,SUDOEXEC
这条规则意味着 tbops 用户组中的用户可以在所有主机上使用 sudo 命令以任何用户身份执行任何命令,同时也可以使用 SUPERMIT 命令别名和 SUDOEXEC 命令别名。但是,用户不允许执行 SHELLS 命令别名,以保证系统的安全性和稳定性。
/etc/passwd
/etc/passwd
是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
文件示例如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
格式为:
用户名:密码:用户标识号:组标识号:注释性描述:主目录:登录 Shell
具体解释如下表:
字段 | 解释 |
---|---|
用户名 | 代表用户账户的字符串,通常长度不超过 8 个字符,并且由大小写字母和/或数字组成 |
密码 | 存放着加密后的用户密码字,但是由于安全隐患,现在多数 Linux 系统使用 shadow 技术将真正的加密后的用户密码字存放到 /etc/shadow 文件中 |
UID | 一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。 |
GID | 记录用户所属的用户组。它对应着 /etc/group 文件中的一条记录。 |
用户信息 | 记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。 |
用户主目录 | 用户的起始工作目录,即用户在登录到系统之后所处的目录。 |
登录shell | 用户登录后启动的进程,也就是用户与 Linux 系统之间的接口。 |
密码字段x
和 *
的区别
x:表示用户密码已经被加密,实际密码存储在 /etc/shadow 文件中。
*:表示密码字段为空,也就是用户无法通过密码登录,比如系统用户或者没有密码的用户
各种 /etc/passwd 之间的区别
文件名 | 介绍 |
---|---|
/etc/passwd |
这是最常见的 /etc/passwd 文件,用于存储所有用户账户的信息,包括用户名、UID、GID、密码、用户信息、主目录和默认 shell 程序等。 |
/etc/passwd- |
这是 /etc/passwd 文件的备份文件,通常在管理员对 /etc/passwd 文件进行修改时,系统会自动创建该备份文件。 |
/etc/passwd+ |
这是一些 Linux 发行版(如 Gentoo)使用的 /etc/passwd 文件,与普通 /etc/passwd 文件的格式略有不同,一般包括用户名、UID、GID、用户信息和主目录等。 |
/etc/passwd.org |
这是一些 Linux 发行版(如 Debian)的 /etc/passwd 文件备份,通常备份的时间点与系统安装时的 /etc/passwd 文件相同。 |
/etc/passwd- |
这是 AIX 操作系统中的 /etc/passwd 文件,与普通的 /etc/passwd 文件的格式略有不同,一般包括用户名、UID、GID、用户信息、主目录、默认 shell 程序和账号过期时间等。 |
管理/etc/passwd 文件命令
useradd
创建用户useradd-test,并设置密码为123,并同时创建一个与用户名相同的用户组,作为用户的主组
useradd -p 123 -U useradd-test
$ cat /etc/passwd | grep useradd-test
useradd-test:x:1000:1000::/home/useradd-test:/bin/bash
$ cat /etc/shadow | grep useradd-test
useradd-test:123:19562:0:99999:7:::
由上可知,useradd 创建用户设置密码是明文的,无法加密,加密需要使用passwd命令
passwd
修改用户密码
$ sudo passwd useradd-test
Changing password for user useradd-test.
New password:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
cat /etc/shadow | grep useradd-test
useradd-test:$6$k.sul8dF$pgZaR8zG1BYjIp9vTemeROXhA2npYLqUfblpZnCgChyVtr4yi9QZSyMLOtqyH85b2ONXeMK.RJU1awlDEUMww/:19562:0:99999:7:::
usermod
修改属性
$ usermod -c "useradd test" useradd-test
$ cat /etc/passwd | grep useradd-test
useradd-test:x:1000:1000:useradd test:/home/useradd-test:/bin/bash
usermod
常见参数
参数 | 命令 | 含义 |
---|---|---|
-l |
usermod -l newname oldname |
修改用户的用户名,其中 newname 是新的用户名,oldname 是旧的用户名。 |
-c |
usermod -c "User Info" username |
修改用户的用户信息,其中 “User Info” 是用户信息,username 是要修改信息的用户名。 |
-g |
usermod -g groupname username |
修改用户所属的主组,其中 groupname 是要更改的用户组名,username 是要修改的用户名。 |
-G |
usermod -G group1,group2 username |
将用户添加到多个用户组中,其中 group1、group2 是要添加的用户组,username 是要修改的用户名。 |
-s |
usermod -s /bin/bash username |
修改用户的默认 shell 程序,其中 /bin/bash 是新的 shell 程序,username 是要修改的用户名。 |
-d |
usermod -d /home/newhome username |
修改用户的主目录,其中 /home/newhome 是新的主目录,username 是要修改的用户名。 |
-e |
usermod -e 2022-12-31 username |
修改用户账号的过期时间,其中 2022 年 12 月 31 日是账号过期的日期,username 是要修改的用户名。 |
-p |
usermod -p password username |
修改用户的密码,其中 password 是新的密码,username 是要修改密码的用户名。需要注意的是,这种方式无法对密码进行加密,因此不太安全,建议使用 passwd 命令来设置密码。 |
-u |
usermod -u uid username |
修改用户的 UID,其中 uid 是新的用户 ID,username 是要修改的用户名。 |
userdel
删除账号
userdel useradd-test
/etc/shadow
/etc/shadow
目录是用于存储用户密码信息的文件目录,也被称为“影子文件”。该目录只有root用户拥有读权限,其他用户不能直接查看或修改该目录下的文件。
格式如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
具体解释:
字段 | 含义 |
---|---|
用户名(Username) | 该字段指定了用户的登录名。 |
加密的密码(Password) | 该字段存储了用户的密码,使用加密算法进行加密。 |
最近一次修改密码的时间(Last change) | 该字段指定了密码上次被修改的时间,表示距离 1970 年 1 月 1 日的天数。 |
最小密码生存期(Minimum days) | 该字段指定了密码修改后必须经过多少天才能再次修改密码。 |
最大密码生存期(Maximum days) | 该字段指定了密码的有效期,表示密码自上次修改后可以保持多长时间。 |
密码过期警告时间(Warning days) | 该字段指定了在密码过期前提醒用户的天数。 |
帐号失效时间(Inactive days) | 该字段指定了多少天用户没有登录系统后,帐号会被自动失效。 |
帐号失效日期(Account expiration) | 该字段指定了帐号的终止日期,表示距离 1970 年 1 月 1 日的天数。 |
/etc/shadow
中*
和!!
区别
在 /etc/shadow 文件中,两个特殊字符 * 和 !! 都表示该用户账户无法登录系统,但它们之间有一些细微的区别。
*
:如果 /etc/shadow 文件中的密码字段为 *,则表示该用户账户已被锁定,无法使用密码进行登录。这种情况通常是由于管理员手动锁定用户账户导致的。
!!
:如果 /etc/shadow 文件中的密码字段为 !!,则表示该用户账户已被禁用,无法使用密码进行登录。这种情况通常是由于系统自动禁用用户账户,例如密码过期或用户长时间未登录系统等。
需要注意的是,无论是 * 还是 !!,都表示该用户账户无法登录系统,但它们之间的区别在于,* 表示用户账户是被管理员手动锁定的,而 !! 则表示用户账户是被系统自动禁用的。在实际使用中,管理员需要根据实际情况进行相应的处理,以确保系统的安全性和稳定性。