文件权限管理
一、权限定义
1、文件权限作用的对象
owner :属主 — u group :属组 — g other :其他人 — o
2、文件的三种权限
//针对文件的权限 r 可读 可以使用cat命令查看文件的类容 w 可写 可以编辑或删除文件 x 可执行 在命令行界面下当做命令提交给内核执行 //针对目录的权限 r 可读 可以使用ls命令查看目录里面包含哪些文件 w 可写 可以在此目录中创建其他的文件或删除此目录中的文件 x 可执行 可以使用cd命令切换至此目录,也可以使用ls -l查看目录内部文件的详细信息 //其他: rw:可以使用vim编辑器打开文件并保存 rx :可以执行执行类似脚本;需要将命令提交给内核才能执行的文件 ;单独使用x可能无法达到想要的效果
3、r、w、x 权限与十进制的转换
r — 4 w — 2 x — 1
二、权限管理命令
1、chmod —— 修改权限命令(可以修改文件或目录)
chmod -R(recursive):递归处理,将该目录下的所有文件及子目录一起处理 <权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置; <权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置; <权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置; 示例 chmod u+r filename chmod g+w filename chmod o+x filename chmod u-r filename chmod g-w filename chmod o-x filename chmod u=rwx filename chmod g=rw filename chmod o=x filename chmod a+r filename chomd a+w filename chomd a+x filename chomd a-r filename chomd a-w filename chomd a-x filename chomd a=rw filename chomd a=x filename
2、chown —— 修改文件或目录的属主或属组权限的命令
chown -R(recursive):递归处理,将指定目录下的所有文件及子目录一并处理 示例 chown username:groupname filename //修改属主和属组 chown username.groupname filename //可以使用点代替冒号 chown username filename //只修改属主 chown :groupname filename //只修改属组 chown .groupname filename chown -R username:groupname filename //递归修改文件属主和属组
三、遮罩码
1、什么是遮罩码
在Linux系统创建一个文件或目录时,一个文件的权限是644,而一个目录的权限时755,这些看上去好像是固定的?
仔细看看就会发现:
1️⃣:该文件都没有执行的权限;且该文件除了属主以外,其他的都没有写和执行的权限;
2️⃣:而目录除了属主以外,其他=都没有写的权限。这些都是由umask遮罩码控制的,遮罩码umask的目的就隐藏一些权限。
3️⃣:umask的默认大小是0022
4️⃣:文件的最终权限是:文件:666 — umask (0022;第一个不用减,从第二个开始;666 — 0022=644)
5️⃣:目录的最权限:目录:777 — umask (0022;第一个不用减,从第二个开始;777—0022=755)
2、查看遮罩码
[root@localhost ~]# umask 0022
四、Linux安全上下文
1、进程有属主和主组;文也有属主和属组
任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限 启动为进程后,其进程的属主为发起者,属组为发起者所属的组 进程访问文件时的权限取决于进程的发起者 进程的发起者是文件的属主时,则应用文件属主权限 进程的发起者是文件的属组时,则应用文件属组权限 应用文件“其它”权限
五、特殊权限
1、SUID(4)、SGID(2)、Sticky(1)
SUID 十进制:4 chmod u+s filename chmod u-s filename 或者 chomd 4644 filename //如果file本身原来就有执行权限,则SUID显示为s(小写),否则显示为S(大写) SGID 十进制:2 chmod g+s filename chomd g-s filename 或者 chmod 2644 filename //如果file本身原来就有执行权限,则SGID显示为s(小写),否则显示为S(大写) Sticky 十进制:1 chomd o+t filename chomd o-t filename 或者 chmod 1644 filename //如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T
2、特殊权限的作用
- SUID
1、SUID权限仅对二进制程序(binary program)有效; 2、执行者对于该程序需要具有x的可执行权限; 3、本权限仅在执行该程序的过程中有效(run-time); 4、执行者将具有该程序拥有者(owner)的权限。 SetUID 的典型应用场景是 passwd 命令。普通用户可以用 passwd 命令修改自己的密码,修改密码实际上是修改 /etc/shadow 文件,而该文件的权限是 000,那么这时就需要普通用户暂时获得 root 用户的身份,来修改 /etc/shadow 文件,以达到修改密码的目的
- SGID
1、SGID对二进制程序有用; 2、程序执行者对于该程序来说,需具备x的权限; 3、SGID主要用在目录上; 如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同
- Sticky
sticky 在英文里面是粘着的意思,而 bit 是位的意思,所以 Sticky BIT 也叫做粘着位。 1、粘着位目前只对目录有效 2、普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限 3、如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件 典型如 /tmp/,任何人都可以在这个目录下进行创建文件或目录,但是只能删除自己创建的目录或文件
3、演示
//SUID [root@localhost ~]# touch file [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod u+x file [root@localhost ~]# ll file -rwxr--r--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod u+s file [root@localhost ~]# ll file -rwsr--r--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod u-x file [root@localhost ~]# ll file -rwSr--r--. 1 root root 0 8月 6 16:02 file //SGID [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod g=rwx file [root@localhost ~]# ll file -rw-rwxr--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod g+s file [root@localhost ~]# ll file -rw-rwsr--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod g-x file [root@localhost ~]# ll file -rw-rwSr--. 1 root root 0 8月 6 16:02 file //Sticky [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod o=rwx file [root@localhost ~]# ll file -rw-r--rwx. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod o+t file [root@localhost ~]# ll file -rw-r--rwt. 1 root root 0 8月 6 16:02 file [root@localhost ~]# chmod o-x file [root@localhost ~]# ll file -rw-r--rwT. 1 root root 0 8月 6 16:02 file 或 //SUID [root@localhost ~]# touch file [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 4644 file [root@localhost ~]# ll file -rwSr--r--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod u+x file [root@localhost ~]# ll file -rwsr--r--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 0644 file [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file //SGID [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 2644 file [root@localhost ~]# ll file -rw-r-Sr--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod g+x file [root@localhost ~]# ll file -rw-r-sr--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 0644 file [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file //Sticky [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 1644 file [root@localhost ~]# ll file -rw-r--r-T. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod o+x file [root@localhost ~]# ll file -rw-r--r-t. 1 root root 0 8月 6 16:09 file [root@localhost ~]# chmod 0644 file [root@localhost ~]# ll file -rw-r--r--. 1 root root 0 8月 6 16:09 file
六、命令委派
1、什么是命令委派
sudo可以实现某个用户能够以另外哪一个用户的身份通过哪些主机执行什么命令
2、主配置文件
/etc/sudoers
3、sudo配置
sudo 使用visudo直接打开/etc/sudoers文件,每一行就是一个sudo条目 格式 who hosts=(runas) command who :运行命令着的身份 hosts :通过哪些主机 (runas) :以哪个用户的身份 command :运行哪些命令
4、示例
[root@localhost ~]# visudo .......... ## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL zhangsan ALL=(ALL) ALL .......... //添加一个zhangsan用户,在任何位置、以任何身份、执行任何命令
5、别名分类
用户别名 User_Alias NETWORKADMIN = 用户的用户名 组名,使用%引导 还可以其它已经定义的用户别名 主机别名 Host_Alias = 主机名 IP地址 网络地址 其它主机别名 runas(用户身份)别名 Runas_Alias = 用户名 %组名 其它的Runas别名 命令别名 Cmnd_Alias = 命令路径 目录(此目录内的所有命令) 其它已定义的命令别名
6、sudo命令语法
sudo [options] command -b:在后台执行指令 -v:延长密码有效期限5分钟,如果超过会再次提示输入密码 -l:列出目前用户可执行与无法执行的指令 -V :显示版本信息 -k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码 -u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份
7、演示
//创建一个zhangsan用户 [root@localhost ~]# ls /home/ [root@localhost ~]# useradd zhangsan [root@localhost ~]# id zhangsan uid=1000(zhangsan) gid=1000(zhangsan) 组=1000(zhangsan) [root@localhost ~]# ls /home/ zhangsan [root@localhost ~]# echo '123456' | passwd --stdin zhangsan 更改用户 zhangsan 的密码 。 passwd:所有的身份验证令牌已经成功更新。 //在/etc/sudoers里面添加一条sudo条目 [root@localhost ~]# visudo .......... ## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL zhangsan ALL=(ALL) /usr/sbin/useradd ........... [root@localhost ~]# cat /etc/sudoers |grep zhangsan zhangsan ALL=(ALL) /usr/sbin/useradd //切换至zhangsan用户执行useradd命令 [root@localhost ~]# su - zhangsan [zhangsan@localhost ~]$ pwd /home/zhangsan [zhangsan@localhost ~]$ sudo useradd lisi 我们信任您已经从系统管理员那里了解了日常注意事项。 总结起来无外乎这三点: #1) 尊重别人的隐私。 #2) 输入前要先考虑(后果和风险)。 #3) 权力越大,责任越大。 [sudo] zhangsan 的密码: [zhangsan@localhost ~]$ id lisi uid=1001(lisi) gid=1001(lisi) 组=1001(lisi) [zhangsan@localhost ~]$ ls /home/ lisi zhangsan //查看zhsngsan用户可以执行的权限 [zhangsan@localhost ~]$ pwd /home/zhangsan [zhangsan@localhost ~]$ sudo -l 匹配 %2$s 上 %1$s 的默认条目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 用户 zhangsan 可以在 localhost 上运行以下命令: (ALL) /usr/sbin/useradd //以zhangsan身份查看版本信息 [zhangsan@localhost ~]$ sudo -V Sudo 版本 1.8.25p1 Sudoers 策略插件版本 1.8.25p1 Sudoers 文件语法版本 46 Sudoers I/O plugin version 1.8.25p1
七、管理命令
1、last —— 显示用户最近登录信息
单独执行last命令,它会读取/var/log/wtmp
的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
last //显示用户登录历史及系统重启历史 -n # //显示最近#次的相关信息 示例 [root@localhost ~]# last root pts/2 192.168.174.1 Fri Aug 7 15:05 still logged in root pts/1 192.168.174.1 Sat Aug 1 14:30 gone - no logout root pts/0 192.168.174.1 Sat Aug 1 00:56 gone - no logout root tty1 Sat Aug 1 00:54 gone - no logout reboot system boot 4.18.0-147.el8.x Sat Aug 1 00:54 still running root pts/2 10.0.0.1 Tue Jul 28 19:52 - 10:43 (2+14:51) root pts/1 10.0.0.1 Tue Jul 28 19:50 - 10:43 (2+14:53) root pts/1 10.0.0.1 Tue Jul 28 01:14 - 01:23 (00:08) root pts/0 10.0.0.1 Tue Jul 28 01:10 - 10:43 (3+09:33) root tty1 Tue Jul 28 00:44 - 10:43 (3+09:59) reboot system boot 4.18.0-147.el8.x Tue Jul 28 00:41 - 10:43 (3+10:01) wtmp begins Tue Jul 28 00:41:43 2020 [root@localhost ~]# last -n 3 root pts/2 192.168.174.1 Fri Aug 7 15:05 still logged in root pts/1 192.168.174.1 Sat Aug 1 14:30 gone - no logout root pts/0 192.168.174.1 Sat Aug 1 00:56 gone - no logout wtmp begins Tue Jul 28 00:41:43 2020
2、lastb —— 显示用户错误的登录列表,此指令可以发现系统的登录异常
单独执行lastb命令,它会读取位于/var/log
目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来
lastb -n # //显示最近#次的相关信息 示例 [root@localhost ~]# lastb btmp begins Sat Aug 1 00:54:30 2020 [root@localhost ~]# lastb -n 3 btmp begins Sat Aug 1 00:54:30 2020 //由于错误登录比较少,所以只有这一个
3、lastlog —— 显示系统中所有用户最近一次成功登录信息
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog
的内容
lastlog -u<用户名>:显示指定用户的最近登录信息 -t<天数>:显示指定天数以来的登录信息 -b<天数>:显示指定天数前的登录信息 示例 [root@localhost ~]# lastlog 用户名 端口 来自 最后登陆时间 root pts/2 192.168.174.1 五 8月 7 15:05:21 +0800 2020 bin **从未登录过** daemon **从未登录过** adm **从未登录过** lp **从未登录过** sync **从未登录过** shutdown **从未登录过** ............... [root@localhost ~]# lastlog -u root 用户名 端口 来自 最后登陆时间 root pts/2 192.168.174.1 五 8月 7 15:05:21 +0800 2020
4、basename、dirname —— 显示路径基名
basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称
[root@localhost ~]# basename /usr/local/src/ src [root@localhost ~]# dirname /usr/local/src/ /usr/local