目录
etc/passwd 文件结构
root@zhaobo:~# head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...
root@zhaobo:~# head -n 5 /etc/shadow
root:$6$jfmG1liEoXaOa2S8$AhreqAh1H1qE07XUqyOVvGLWJDoInlZDD.YJECXOSxm1tclBV05TvoQJnWgJwdBxDoNBDvCul3fuPYbt/ss1A.:18854:0:99999:7:::
daemon:*:18395:0:99999:7:::
bin:*:18395:0:99999:7:::
sys:*:18395:0:99999:7:::
sync:*:18395:0:99999:7:::
在passwd文件中存放的是账号信息,每一行都是一个账号,每一个账号有七个属性,分别用(:)分隔,分别是账号名称、密码、UID、GID、用户信息说明、家目录、shell。
- 账号
就是明文方式,提供对数字不敏感的人类使用登录系统的,需要用来对应的UID,例如root对应的0.
- 密码
早期的UNIX系统的密码是存放到这个字段的,但是文件的特性是所有的程序都可以访问,所以很容易泄露,后来就将密码放到/etc/shadow,这个字段则就用【x】占位。
- UID
用户表示符号
0 系统管理员
1-999 系统账户
1000-60000 可登录账户 实际上3.10x版已经支持(2^32-1)这么大的UID号码。
- GID
这个与文件/etc/group有关系。这个和passwd文件概念一样,用来规范组名和GID对应的关系。
- 用户信息说明栏
没什么用……
- 家目录
每一个账户都用一个自己的家的目录地址,root的在根目录下,其他的用户在/home/下。
- shell
每一个用户登录后会获取相应的shell与内核沟通,然后进行用户的操作任务。,有一个shell可以让用户登录时无法获取shell,那就是sbin/nologin
/etc/shadow文件结构
这个目录的东西就是密码,早期密码时放在passwd中后面因为安全问题就分离到shadow中,其他用9个字段。分别是
(linux计算时间是以1970年1月1日开始)bash只支持整数。
-
账号
-
密码
-
最近更改密码时间
-
密码不可被更改时间
设置新密码后多少天内不可以更改密码
-
密码需要更改的时间
在这个期间需要更改密码(密码更改后所以的属性到期时间都会刷新)
-
密码需要更改期限前的警告天数(参照:密码需要更改的时间)
提示还有多少天密码过期,提示更改密码
-
密码过期后的宽限时间(密码需要更改的时间)
仍然可以登录,只不过输入旧密码后会强制需要设置新密码后才可以使用资源
-
账号失效日
到期后账号将无法使用
-
保留(保留字段,看以后有没有新功能)
/etc/group 文件结构
[root@localhost ~]# head -n 5 !$ head -n 5 /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: adm:x:4: ```
和passwd文件一样这个文件是记录用户组和GID之间对应的信息,由上可以看到有4块分别用:分隔,分别表示:
组名、用户密码组、GID、此用户支持的账号名称。
-
组名
就是组的名称,方便人使用,基本上与GID一一对应
-
用户组密码
通常不用设置,给用户组管理员使用,同样密码移到/etc/gshadow中,此位置以【x】代替。
-
GID
用户组ID
-
此用户支持的账号名称
一个账号同时可以属于多个组,一个组中包含多个账号,如果是需要将一个用户加入到这个组中,只需要在这个组文件中第四个字段加入用户名即可,例如:root❌0:zhaobo,zhangsan 多个用户用“,”号隔开,之间没有空格、
账号管理
实际上在linux中创建一个账号是十分的简单的只需要两步,创建账户、设置密码。账号的创建需要的命令是useradd,密码则需要的是passwd。
useradd
关于useradd的官方使用说明:
[root@localhost ~]# useradd ?
用法:useradd [选项] 登录
useradd -D
useradd -D [选项]
选项:
-b, --base-dir BASE_DIR 新账户的主目录的基目录
-c, --comment COMMENT 新账户的 GECOS 字段 也就是passwd文件中第5栏中的说明内容。
-d, --home-dir HOME_DIR 新账户的主目录
-D, --defaults 显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE 新账户的过期日期
-f, --inactive INACTIVE 新账户的密码不活动期
-g, --gid GROUP 新账户主组的名称或 ID
-G, --groups GROUPS 新账户的附加组列表
-h, --help 显示此帮助信息并推出
-k, --skel SKEL_DIR 使用此目录作为骨架目录
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库
-m, --create-home 创建用户的主目录
-M, --no-create-home 不创建用户的主目录
-N, --no-user-group 不创建同名的组
-o, --non-unique 允许使用重复的 UID 创建用户
-p, --password PASSWORD 加密后的新账户密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-s, --shell SHELL 新账户的登录 shell
-u, --uid UID 新账户的用户 ID
-U, --user-group 创建与用户同名的组
-Z, --selinux-user SEUSER 为 SELinux 用户映射使用指定 SEUSER
```
当然这边并不需要我们记住所用,只需要记住几个常用的就可以:
-u 指定新建用户的UID 这边需要知道的是0为root用户、1-999为系统用户、1000- 之后的则是我们普通用户的。
-g 指定新建用户所属的GID也就是初始化用户组,此用户组会存放在passwd中的第四栏中。
-G 后接用户组,表示新建用户还可以加入的其他用户组,会记录到group的最后一项中
-m 建立家目录(一般用户默认值)
-M 不建立使用家目录(系统用户默认值)
(因为系统账号是专门用来执行系统所需要的服务权限而设置的,所以系统账号一般默认不主动建立家目录)
-c passwd文件中的第五栏,也就是账号说明
-d 指定某个路径为家目录,不使用默认值。 用绝对路径
-r 建立系统账号
-s 后米娜接入一个shell,默认是/bin/bash
-e 账号失效日期
-f 密码失效日期
其实我们也可以提供useradd直接创建一个账号,它的作用有:
-
在etc/passwd建立一行与所建立的用户相关的信息
-
在etc/shadow建立一行 账号密码的相关参数 但是没有密码
-
在etc/group建立一行与用户名同名的用户组
-
在home/建立一个与用户同名的目录作为用户的家目录。
但是因为密码为空,用户是不能正常使用的需要我们通过passwd命令设置密码才可以使用。useradd的这些功能其实都是useradd的默认属性文件规定的,关于useradd默认属性可以通过useradd -D 命令
[root@localhost skel]# useradd -D GROUP=100 //默认的用户组 HOME=/home 默认的家目录 INACTIVE=-1 密码失效日 EXPIRE= 账号失效日 SHELL=/bin/bash 默认shell SKEL=/etc/skel 家目录数据参考目录 CREATE_MAIL_SPOOL=yes 是否主动帮使用者建立邮箱
咱这边看一下第一个 GROUP则是新建用户的用户组,上面100则指定新建用户的用户组为100也就是指users,但是咱上面说不是新建用户和新建用户的用户组是同名吗,这不是互相矛盾吗! 其实是这样的针对于用户组有两个机制分别为:
-
私有用户组机制
账号建立的时候会同时建立一个和用户同名的用户组,这种机制比较安全保密,每一个用户有自己专属用户组,而且家目录的权限是700,也就是只有自己可以进入,不会参考默认值100,代表的发行版本有:RHEL、Fedora、CenterOS等。
-
公共用户组机制
这个则会参考GROUP的默认值。每一个用户都属于users用户组,且默认的家目录权限是drwxr-xr-x 也就是大家都可以共享家目录的数据,代表的发行本版:SUSE等
可以参考上面的说明可以看出CenterOS属于私有用户组机制。
-
除过这些基础的账号设置以为在使用useradd时还会参考/etc/login.defs文件
[root@localhost ~]# cat /etc/login.defs
#邮箱的放置目录
MAIL_DIR /var/spool/mail
#MAIL_FILE .mail
# 如果没有设置HOME_MODE则创建家目录的权限用UMASK
UMASK 022 //默认创建文件的权限
HOME_MODE 0700 //创建家目录的默认权限
# 密码老化控制:
#
# PASS_MAX_DAYS 密码过期时间.
# PASS_MIN_DAYS 密码可更改最小时间.
# PASS_MIN_LEN 最小密码长度.
# PASS_WARN_AGE 密码过期提示时间.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#
# useradd中自动uid选择的最小/最大值
#
UID_MIN 1000
UID_MAX 60000
# 系统账号
SYS_UID_MIN 201
SYS_UID_MAX 999
#
#useradd中自动GID选择的最小/最大值
#
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
#
#如果已定义,则在删除用户时运行此命令。
#它应该删除所有的at/cron/print作业等
#要删除的用户(作为第一个参数传递)。
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# 在不加-M 和-m的时候是否创建家目录。
#
CREATE_HOME yes
# 删除用户的时候,是否一同删除用户组
#
USERGROUPS_ENAB yes
# 密码加密方式
ENCRYPT_METHOD SHA512
到这里useradd命令的所有信息都告一段落,所用到的文件有:
etc/passwd
etc/shadow
etc/group
etc/gshaow
etc/default/useradd
etc/login.defs
etc/skel/*
passwd
之前咱说个useradd这个命令并不会创建密码,账号是暂时锁定状态,所以要通过passwd设置密码。
[root@localhost ~]# passwd --help
用法: passwd [选项...] <帐号名称>
-k, --keep-tokens 保持身份验证令牌不过期
-d, --delete 删除命名帐户的密码(仅限 root 用户);也删除密码锁(如果有)
-l, --lock 锁定指名帐户的密码(仅限 root 用户) etc/shadow第二栏加上! 短暂失效!
-u, --unlock 解锁指名帐户的密码(仅限 root 用户)
-e, --expire 终止指名帐户的密码(仅限 root 用户)
-f, --force 强制执行操作
-x, --maximum=DAYS 密码的最长有效时限(只有 root 用户才能进行此操作)
-n, --minimum=DAYS 密码的最短有效时限(只有 root 用户才能进行此操作)
-w, --warning=DAYS 在密码过期前多少天开始提醒用户(只有 root 用户才能进行此操作)
-i, --inactive=DAYS 当密码过期后经过多少天该帐号会被禁用(只有 root 用户才能进行此操作)
-S, --status 报告已命名帐号的密码状态(只有 root 用户才能进行此操作)
--stdin 从标准输入读取令牌(只有 root 用户才能进行此操作)
帮助选项:
-?, --help 显示这个帮助信息
--usage 显示简短的使用说明
passwd就没有什么特别唠嗑的东西,passwd不跟用户则就更改当前用户的密码,后面要是接入用户名则更改接入的用户名的密码。对于root用户的时候不管输入什么密码系统都会接受,虽然提示输入不正确,但是两次输入后都会设置成功,而且不需要输入旧密码。对于普通用户就比较繁琐。首先要输入旧密码,然后需要输入两次新密码。对于新密码也有及其严格的要求——(PAM)模块。这边需要提示的是PAM模块会覆盖/etc/login.defs内的PASS_MIN_LEN设置。PAM写在/etc/pam.d/passwd
passwd -S admin
[root@localhost pam.d]# passwd -S admin
admin PS 2021-08-28 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
除了passwd -S 之外,还可以用chage命令
[root@localhost pam.d]# chage
用法:chage [选项] 登录
选项:
-d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期” 设置0则用户登录的时候需要更改密码
-E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
-h, --help 显示此帮助信息并推出
-I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
-l, --list 显示帐户年龄信息
-m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
-M, --maxdays MAX_DAYS set maximum number of days before password
change to MAX_DAYS
-R, --root CHROOT_DIR chroot 到的目录
-W, --warndays 警告天数 将过期警告天数设为“警告天数”
[root@localhost pam.d]# chage -l admin最近一次密码修改时间 :8月 28, 2021密码过期时间 :从不密码失效时间 :从不帐户过期时间 :从不两次改变密码之间相距的最小天数 :0两次改变密码之间相距的最大天数 :99999在密码过期之前警告的天数 :7
这边看一个示例,比如说在一个教学环境中,老师需要建立学生账号,这个账号数量不是一个、两个,所以老师可以通过用学生学号批量新建账号,同时密码也是,但是在学生首次登录后系统会强制需要用户修改登录密码。这样防止学生故意篡改其他学生的数据。
首先创建账号设置密码,通过chage -d 0 让更改密码时间退回1970/1/1 这样下次登录会强制让改密码。useradd admin3passwd admin3> 设置密码chage -d 0 admin3ssh admin3@192.168.0.108Connecting to 192.168.0.108:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'.You are required to change your password immediately (administrator enforced)Activate the web console with: systemctl enable --now cockpit.socketLast login: Sun Aug 29 23:33:07 2021 from 192.168.0.105WARNING: Your password has expired.You must change your password now and login again!更改用户 admin3 的密码 。Current password: 新的 密码:重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。Connection closed by foreign host.Disconnected from remote host(192.168.0.108:22) at 23:33:52.Type `help' to learn how to use Xshell prompt.[c:\~]$ ssh admin3@192.168.0.108Connecting to 192.168.0.108:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'.Activate the web console with: systemctl enable --now cockpit.soc , MN ketLast login: Sun Aug 29 23:33:35 2021 from 192.168.0.105
usermod
userdel
删除用户的相关数据,参数-r 连同用户的家目录一块删除。
用户功能
id
可以列出账号的信息
[root@localhost ~]# id admin3uid=1004(admin3) gid=1004(admin3) 组=1004(admin3)[root@localhost ~]# iduid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
finger
可以查看很多用户的信息!我电脑没有安装。。。。。
chfn
在/etc/passwd第五栏加入信息。
[root@localhost ~]# chfn 正在更改 root 的 finger 信息。名称 [root]: zhaobo办公 []: hou^Hmechfn: home:含有非法字符办公 []: home办公电话 []: 184xxxx4196住宅电话 []: xxxxx001Finger 信息已更改。[root@localhost ~]# grep root /etc/passwdroot:x:0:0:zhaobo,home,184xxxx4196,xxxxx001:/root:/bin/bash也可以通过finger 查看
chsh
chsh的功能是列出目前可用的shell或者是更改自己的shell。
[root@localhost ~]# chsh -h用法: chsh [选项] [<用户名>]更改您的登录 shell。选项: -s, --shell <shell> 指定登录 shell -l, --list-shells 打印 shell 列表并退出[root@localhost ~]# chsh -l/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash
新增与删除用户组
groupadd
和useradd一样就是新建用户组:
group 可选参数-g 指定新建用户组GID-r 创建用户组为系统用户组
groupmod
groupmod可选参数:-g 更改用户组GID的值 goup-n 更改用户组的名称 name
gpasswd
用户组管理员功能
[root@localhost ~]# gpasswd用法:gpasswd [选项] 组选项: -a, --add USER 向组 GROUP 中添加用户 USER -d, --delete USER 从组 GROUP 中添加或删除用户 -h, --help 显示此帮助信息并推出 -Q, --root CHROOT_DIR 要 chroot 进的目录 -r, --delete-password remove the GROUP's password -R, --restrict 向其成员限制访问组 GROUP -M, --members USER,... 设置组 GROUP 的成员列表 -A, --administrators ADMIN,... 设置组的管理员列表除非使用 -A 或 -M 选项,不能结合使用这些选项。
[root@localhost ~]# groupadd textgroup[root@localhost ~]# gpasswd textgroup正在修改 textgroup 组的密码新密码:请重新输入新密码:[root@localhost ~]# gpasswd -A admin3 textgroup [root@localhost ~]# grep textgroup /etc/gshadow /etc/grouptextgroup:$6$BiFIhH4m5a/$WRscRUL./UUIwWHvriD9eYw0/JoEbnl.O5mio.awRUW7pmTelwO1Q1TR/U1kqn0cI3Mnrd92rAVDxo3B9lPCJ1:admin3:textgroup:x:1005:[root@localhost ~]# su admin3[admin3@localhost ~]$ iduid=1004(admin3) gid=1004(admin3) 组=1004(admin3) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[admin3@localhost ~]$ gpasswd -a admin3 textgroup 正在将用户“admin3”加入到“textgroup”组中[admin3@localhost ~]$ gpasswd -a admin textgroup 正在将用户“admin”加入到“textgroup”组中 [admin3@localhost ~]$ grep textgroup /etc/grouptextgroup:x:1005:admin3,adminPS:首先建立用户组textgroup 设置密码 将admin3设置为textgroup的管理员 用admin3用户身份将admin、admin3加入到textgroup
主机的详细权限规划:ACL使用
ACL是access Control list 的英文缩写,中文意思是访问控制列表,主要的目的是提供传统的权限以外的详细权限设置。
ACL可以针对:
-用户(user):可以针对用户权限
-用户组(group):可以针对用户组为对象设置其权限
-默认权限(mask):最大允许权限!
setfacl 设置某个文件/目录的ACL设置权限
[root@localhost home]# setfacl -h
setfacl 2.2.53 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl 设置ACL的权限
-M, --modify-file=file 从文件中读取要修改的ACL项
-x, --remove=acl 删除后续的ACL参数
-X, --remove-file=file 读取要从文件中删除的ACL项
-b, --remove-all 删除所有的扩展ACL表项
-k, --remove-default 删除默认的acl
-------------------------------------------------------
-d, --default 定义默认的acl值
-R, --recursive 递归设置
-v, --version print version and exit
-h, --help this help text
-针对用户的acl设置
[root@localhost ~]# touch text 这边首先新建了一个名为text的文件
[root@localhost ~]# ll ./text
-rw-r--r--. 1 root root 0 8月 31 18:38 ./text 查看文件的权限为644
[root@localhost ~]# setfacl -m u:admin3:rwx ./text 给文件设置关于用户admin3的acl权限 为7.
[root@localhost ~]# ll ./text
-rw-rwxr--+ 1 root root 0 8月 31 18:38 ./text 从ls看文件权限基本没有变化唯一后面多了+号
[root@localhost ~]# setfacl -m u::rwx ./text 如果u后面为空则表示设置文件拥有者的权限。
[root@localhost ~]# ll ./text
-rwxrwxr--+ 1 root root 0 8月 31 18:38 ./text 文件拥有者权限变成7
ps:从某种意义来说文件text仍然不能被用户admin3操作,因为从root@localhost可以看出当前用户为root,而~可以知道文件时在root的家目录。然而root家目录的权限是:dr-xr-x--- 所以admin3用户是没有权限进入root的目录更不用说操作text文件夹,解决这个问题的办法就是将文件移动到根目录,或者其他admin3可以进入的目录即可!
~~~这边有一个大胆的想法,我们能不能将root的根目录给用户admin3一个acl特权,让他可以进出纳!(当然不建议这么搞!)
[root@localhost ~]# setfacl -m u:admin3:rx .
//这边可以看出我们给用户admin3针对于/root目录一个rx的权限,现在总可以更改文件了吧!当然答案是:可以!
[admin3@localhost root]$ echo "nihao shijie ">./text
[admin3@localhost root]$ cat ./text
nihao shijie
//呕吼!确实,那么我们给root目录再建立一个text1文件看看
[admin3@localhost root]$ touch text1
touch: 无法创建 'text1': 权限不够
//额!为什么又权限不够,不是上一个文件可以写入可以读取吗!实际上我们只给用户admin3->root目录一个rx,虽然有进入权限和读取文件列表的权限,但是没有更改目录结构的权限。所以不能新建文件以及目录。
//呵!那我删了这个文件总可以了吧,毕竟我acl权限是rwx的权限!
[admin3@localhost root]$ rm ./text
rm: 无法删除'./text': 权限不够
//啊偶!why?我不是对文件有w的权限嘛!还是和上面一样,删除也是更改目录结构,对于文件的acl权限的W是针对文件数据,这个w表示你可以对文件text的内容数据进行删除、添加、更改等等,因为目录没有w权限,所以。。。。啥也不是!
很绕?这什么你对上一章节的文件权限目录还是有些生疏,赶紧回去看看。听话,乖!
关于取消acl权限:
取消acl参数用 -x这边个人理解这个取消有点反人类!为啥!看看[root@localhost ~]# setfacl -x u:admin3:r-x /root 个人理解 -x 然后指定用户为admin3 取消的权限是rx 很正常叭! 结果……。setfacl: Option -x: 无效的参数 near character 10正确的方法是:[root@localhost ~]# setfacl -x u:admin3: /root 这样就取消了!真的是反人类。如果我只删除r的权限,然后保留x的权限,怎么办!难道让我先取消所有,然后再加入x的权限!咦~ 其实有别的办法:[root@localhost ~]# setfacl -m u:admin3:--x /root 这样就删除了r的权限 保留了x的权限!个人感觉属实反人类!难以理解。
getfacl 获取某个文件/目录的ACL设置权限
相对于setfacl,getfacl的用法相对简单只需要后面加入需要查看文件的文件名或者目录即可。
结合上面的![root@localhost ~]# getfacl ./text # file: text# owner: root# group: rootuser::rwxuser:admin3:rwxgroup::r--mask::rwxother::r--[root@localhost ~]# getfacl .# file: .# owner: root# group: rootuser::r-xuser:admin3:r-xgroup::r-xmask::r-xother::---
file:表示文件名或目录名
owner:所有者权限
group:组权限
有没有发现上面这三个最前面都有“#”号,这代表文件默认权限!
user:表示用户的acl权限 用户第二栏空白表示文件所有者
group:组的acl权限
mask:后面说!
other:其他用户组acl权限。
-针对单一用户组的权限设置
对于特定用户组的acl权限设置和上面差不多,只需要将u变为g即可 【g:用户组名:权限】
-针对有效权限mask的设置
mask就是规定acl的最大允许权限,如果说当mask为r-时!咱上面的r-x权限真正有效的权限就只有r。明白了吧。
mask的设置
setfacl -m m:r ./text 就是设置./text的最大允许权限为r。
使用默认权限设置未来目录文件acl继承权限【d:[u|g]:[user|group]:权限】
这个也很简单,和上面的相比就是多了一个d,没错这个d就是默认权限继承的flag。
用户身份权限
su
[root@localhost ~]# su -h
用法:
su [选项] [-] [<用户> [<参数>...]]
选项:
-m, -p, --preserve-environment 不重置环境变量
-g, --group <组> 指定主组
-G, --supp-group <group> specify a supplemental group
-, -l, --login 使 shell 成为登录 shell
-c, --command <命令> 使用 -c 向 shell 传递一条命令
--session-command <命令> 使用 -c 向 shell 传递一条命令
而不创建新会话
-f, --fast 向shell 传递 -f 选项(csh 或 tcsh)
-s, --shell <shell> 若 /etc/shells 允许,运行<shell>
-P, --pty create a new pseudo-terminal
简单点主要区别su和su -的命令
加上- 会连同PATH、USER、MAIL的变量都转成新用户的环境。
sudo
虽然我们一直使用sudo来执行我们当前用户无法执行的命令,有的人会误认为sudo可以短暂的获取root权限,实际上并不是。sudo可以让你以其他用户的身份执行命令(通常是root执行),实际上并非所有的用户都可以使用sudo命令而是规范到/etc/suders内的用户才能执行sudo这吗命令。
[admin3@localhost root]$ sudo cat /etc/sudoers
[sudo] admin3 的密码:
admin3 不在 sudoers 文件中。此事将被报告。
看到了吧,确实并不是所有的用户都可以使用sudo。
sudo的常用可选参数【b|u】
-b 后面接命令,命令会放到后台执行,而不影响当前shell
-u 后面可以接欲切换的使用者,如没有此项 则表示用root身份。
·································
[root@localhost ~]# sudo -u sshd touch /tmp/mysshd
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ll
总用量 0
-rw-r--r--. 1 sshd sshd 0 9月 2 18:00 mysshd
-------------------------------------------------
[root@localhost tmp]# sudo -u zhaobo sh -c "mkdir ~zhaobo/www;cd ~zhaobo/www;echo 'this is index.php'>index.html"
-------------------------------------------------
当然可以通过上面的方式在后面加入 sh -c “命令;命令”;
首先我们看一看sudo的运行流程:
- 当用户执行sudo时,系统在etc/sudoers文件中查找用户是否有执行sudo的权限。
- 若用户有执行sudo的权限,则用户输入自己的密码确认
- 若密码输入成功,执行后面的命令(root执行sudo时不需要输入密码)
- 若切换身份和当前用户一致也不需要密码。
所以使用sudo重点时看文件/etc/sudoers文件,特殊的是sudoers文件不能直接通过vim编辑,因为有特殊的语法限制,保存时候也会检测,如果有误会运行sudo的正常使用!这里提供visudo编辑sudoers文件。
那么我们如何将普通用户赋予sudo的使用权限纳!看下面:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin3 ALL=(ALL) ALL
使用者账号 登陆者来源=可切换的身份 可以执行的命令(特殊指定时务必使用绝对路径)
(ALL)代表所有
上面就将admin3赋予sudo的使用权限。当然这种方法也是有局限性!看看下面的这种方法。
使用wheel用户组设置:
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
默认有的地方是用#号注释的,当删除#号代表开启!当开启时只需要将用户加入到wheel这个用户组中就可以拥有sudo的权限。当然wheel这个名称也可以自己修改!
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
这一行客气则表示sudo的时候不需要输入密码。简单粗暴 不安全。
之后只需要通过usermod将用户加入到wheel用户组中就可以达到上面的效果。
当然上面的操作会让用户拥有sudo的权限,这权限仅次于root因为我们并没有对其进行约束!如何对其约束,举个栗子:我们只需要一个用户帮root进行对用户密码更改的管理,如何实现:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin3 ALL=(ALL) /usr/bin/passwd
上面可以看到我们虽然给用户admin3赋予sudo的执行权限,但是只能执行passwd,哈哈哈!
[admin3@localhost ~]$ sudo passwd admin
[sudo] admin3 的密码:
更改用户 admin 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[admin3@localhost ~]$ sudo passwd
更改用户 root 的密码 。
新的 密码:
可以看到用户admin3通过sudo对admin更改了密码。但是后面问题大了,直接使用passwd不加如何参数,咋就修改的时root密码!所以我们需要对sudoers文件进行微调!再次限制sudo参数。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin3 ALL=(ALL) !/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [a-zA-Z]*
```````````````````````````````````````````````````````
[admin3@localhost ~]$ sudo passwd
[sudo] admin3 的密码:
对不起,用户 admin3 无权以 root 的身份在 localhost.localdomain 上执行 /bin/passwd。
!代表的是不可执行,现在admin3就无法执行sudo passwd 修改root密码了。
关于sudoers的alias用法,这针对于有大量的账号需要设置相同的sudo权限使用。
User_Alias 、Cmnd_Alias、Host_Alias分别代表:用户、命令、用户来源
User_Alias AD=用户1、用户2、用户3、用户4
Cmnd_Alias CD=(ALL)
Host_Alias HT=(ALL)
AD HT=(root) CD
唯一需要注意的是像AD、CD、HT 可以随便设置但是一定要大写。这种方法方便以后管理。
高级用法:sudo和su搭配使用
如果一些管理人员需要root环境处理事务,但是root账号也不能轻易的将他的密码告诉其他人,那就用这方法:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin3 ALL=(ALL) !/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [a-zA-Z]*
User_Alias US= admin,admin3
US ALL=(root) /bin/su - 《====关键点
-------------------------------------------------------------
[admin@localhost ~]$ sudo su -
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] admin 的密码:
[root@localhost ~]# <===== 输入admin的密码直接进入root环境 哈哈哈
上面操作当然要慎重行事!!!
Linux主机用户传递信息
查询用户:w、who、last、lastlog
[root@localhost ~]# w
21:56:07 up 9:41, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 192.168.0.105 20:29 1.00s 0.35s 0.00s w
who
[root@localhost ~]# who
root pts/2 2021-09-02 20:29 (192.168.0.105)
last:列出自系统建立以来所有的用户登录信息
[root@localhost ~]# last
root pts/2 192.168.0.105 Thu Sep 2 20:29 still logged in
........
root pts/1 192.168.0.152 Mon Aug 16 17:08 - 17:08 (00:00)
zhaobo tty2 tty2 Mon Aug 16 16:50 - down (06:45)
reboot system boot 4.18.0-305.12.1. Mon Aug 16 16:47 - 23:35 (06:48)
wtmp begins Mon Aug 16 16:47:18 2021
lastlog:所有账号最近登录时间.
[root@localhost ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/2 四 9月 2 21:36:28 +0800 2021
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
.....
stap-server **从未登录过**
admin pts/2 四 9月 2 21:36:15 +0800 2021
wed1 **从未登录过**
admin2 **从未登录过**
用户对谈:write、mesg、wall
write可以指定和某个用户进行对话!
mesg可以屏蔽对话
wall 广播 只有root可以有效的使用,广播到所有人。