Linux文件和文件夹权限管理

Linux有用户和用户组的概念,为了区分不同用户和用户组对资源的利用管理''范围'',还需要配合Linux权限管理,下面简单记录下,以下操作全部基于centos6.5。

权限及其操作

权限一般有逻辑权限、物理权限,以及用户root权限的说法。

逻辑权限

随便打开一个文件或文件夹,使用ll命令后可以查看逻辑权限的内容。

# 这个文件的权限为:root用户可读可写,root用户组可读,其他用户可读
-rw-r--r--. 1 root root    0 Oct 16 13:12 messi

那具体前面那一串-rw-r--r--是什么意思,参考如下表格。

字符 含义
- 占1位,-代表普通文件类型,d代表目录,l代表符号链接文件,b代表块文件等
用户权限 占2-4位,r代表读权限,w代表写权限,x代表执行权限
用户组权限 占5-7位,权限同上
其他权限 占8-10位,权限同上

这就是逻辑权限的概念,对应的命令就是chmod,下面演练一下,具体命令解释在注释中。

给hadoop目录设置用户可读可写可执行,给用户组设置可读可执行,给其他用户设置可读可执行权限。

# 直接用数字
[root@node02 /home]# chmod 755 hadoop
# 指定用户使用u,指定用户组使用g,指定其他使用o,如果是所有都执行则指定a
[root@node02 /home]# chmod u+rwx,g+rx,o+rx hadoop
[root@node02 /home]# ll
total 20
# 修改hadoop目录权限成功
drwxr-xr-x. 2 root root 4096 Oct 16 16:47 hadoop

给hadoop设置不可读写操作权限,再修改为用户,用户组和其他都具有可执行权限。

[root@node02 /home]# chmod 000 hadoop
[root@node02 /home]# ll
total 20
# 修改成功
d---------. 2 root root 4096 Oct 16 16:47 hadoop
[root@node02 /home]# chmod +x hadoop
[root@node02 /home]# ll
total 20
# 修改成功
d--x--x--x. 2 root root 4096 Oct 16 16:47 hadoop

物理权限

物理权限可以修改某个文件或文件夹不可以修改、增加和删除等权限,一般不给根目录/、临时文件夹/tmp、日志文件夹/var,挂载文件夹/dev设置。

添加物理权限语法为 chattr [选项] 文件名或目录名

[root@node02 /home]# chattr --help
Usage: chattr [-RVf] [-+=AacDdeijsSu] [-v version] files..

其中常用选项如下:

选项 解释
i 表示不能对文件或文件夹进行修改、增加和删除
a 表示文件或文件夹只能追加操作,不能修改和删除
R 递归处理
S 即时更新文件或目录
s 保密删除文件或目录
+ <属性> 开始某个物理权限
- <属性> 关闭某个物理权限

查看物理权限语法为 lsattr [选项] 文件或文件夹

-R     Recursively list attributes of directories and their contents.
-a     List all files in directories, including files that start with ‘.’.
-d     List directories like other files,  rather  than  listing their contents.

将hadoop文件夹设置为不可修改、增加和删除操作,然后尝试在文件夹里新建文件。

# 修改物理权限
[root@node02 /home]# chattr +i hadoop
# 查看物理权限,包括隐藏文件
[root@node02 /home]# lsattr -a hadoop
-------------e- hadoop/..
----i--------e- hadoop/.
[root@node02 /home]# cd hadoop
# 在hadoop文件夹下新建文件,提示不允许
[root@node02 /home/hadoop]# touch log.txt
touch: cannot touch `log.txt': Permission denied

修改hadoop文件夹为可追加,再次尝试在文件夹里新建文件。

# 关闭i物理权限
[root@node02 /home]# chattr -i hadoop
# 增加a物理权限,代表可追加
[root@node02 /home]# chattr +a hadoop
# 查看已添加可追加权限
[root@node02 /home]# lsattr -a 
-----a-------e- ./hadoop
[root@node02 /home]# cd hadoop
[root@node02 /home/hadoop]# touch log.txt
[root@node02 /home/hadoop]# ll
total 0
# 添加文件成功
-rw-r--r--. 1 root root 0 Oct 16 17:21 log.txt
[root@node02 /home/hadoop]# 

普通用户root权限

sudo命令让普通用户也可以拥有root的权限,这样在普通用户下可以执行root用户部分操作,它有如下优点。

(1)可以使用root用户配置的环境

(2)不需要切换root用户也可以执行操作

(3)限制用户执行有限的root权限

(4)可以记录sudo命令,方便后续查看操作日志,排查危险操作

下面是参考博文完成的sudo操作日志记录。

a 修改/etc/rsyslog.conf文件,添加如下内容到文件最后

[root@node02 /var/log]# vim /etc/rsyslog.conf 

# 打印sudo操作记录
local2.debug                                            /var/log/sudo.log

b 使用visudo命令编辑/etc/sudoers,添加如下内容到最后

[root@node02 /var/log]# visudo

## 记录sudo日志配置
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=0
Defaults !syslog

c 在/etc/log目录下新建一个sudo.log文件,然后重启rsyslog服务

[root@node02 /var/log]# touch sudo.log
[root@node02 /var/log]# cat sudo.log 
[root@node02 /var/log]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

d 切换到hadoop用户,执行一个cd操作

[root@node02 /home]# su hadoop
[hadoop@node02 /home]$ sudo cd /root

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for hadoop: 
# 提示没有在sudoers添加hadoop sudo权限,需要修改/etc/sudoers文件
hadoop is not in the sudoers file.  This incident will be reported.

e 添加hadoop sudo权限

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
# 代表hadoop用户可以执行sudo命令,需要密码
hadoop  ALL=(ALL)       ALL
# 代表hadoop用户组可以执行sudo命令,需要密码
# %hadoop  ALL=(ALL)      ALL
# 代表hadoop用户可以执行sudo命令,不需要密码
# hadoop   ALL=(ALL)      NOPASSWD:ALL
# 代表hadoop用户组可以执行sudo命令,不需要密码
# %hadoop  ALL=(ALL)      NOPASSWD:ALL

f 重新执行发现成功执行sudo命令

[root@node02 /home]# su hadoop
[hadoop@node02 /home]$ sudo ls /home
[sudo] password for hadoop: 
book  hadoop  messi  passwd  test  
[hadoop@node02 /home]$ cat /var/log/sudo.log 
# 第一条就是上面提示的没有添加hadoop到sudoers文件的日志
Oct 16 20:03:42 : hadoop : user NOT in sudoers ; TTY=pts/1 ; PWD=/home ; USER=root ; COMMAND=cd /root
# 正常执行 ls /home命令后的日志
Oct 16 20:19:00 : hadoop : TTY=pts/1 ; PWD=/home ; USER=root ; COMMAND=/bin/ls /home

权限应用实操

实操1:创建两个文件夹hadoop和hive,让文件夹对不同用户组的用户进行开放,用户组名bigdata01,bigdata02。

以下是实现的一种方式,利用权限,用户和组的知识来完成。

a 创建用户组bigdata01和bigdata02

[root@node02 /home]# groupdel bigdata01
[root@node02 /home]# groupdel bigdata02
[root@node02 /]# cat /etc/group
...
# 查看发现创建group成功
bigdata01:x:1000:
bigdata02:x:1001:

b 在/根目录下创建用户根目录bigclub,创建4个用户,让用户家目录在/bigclub目录下。

[root@node02 /]# mkdir bigclub
# 创建四个用户,指定家目录和用户组
[root@node02 /]# useradd -d /bigclub/stu1 -m -g bigdata01 stu1
[root@node02 /]# useradd -d /bigclub/stu2 -m -g bigdata01 stu2
[root@node02 /]# useradd -d /bigclub/stu3 -m -g bigdata02 stu3
[root@node02 /]# useradd -d /bigclub/stu4 -m -g bigdata02 stu4
[root@node02 /]# id stu1
uid=501(stu1) gid=1000(bigdata01) groups=1000(bigdata01)
[root@node02 /]# id stu2
uid=502(stu2) gid=1000(bigdata01) groups=1000(bigdata01)
[root@node02 /]# id stu3
uid=503(stu3) gid=1001(bigdata02) groups=1001(bigdata02)
[root@node02 /]# id stu4
uid=504(stu4) gid=1001(bigdata02) groups=1001(bigdata02)
[root@node02 /]# cd /bigclub
# 查看家目录
[root@node02 /bigclub]# ll
total 16
drwx------. 2 stu1 bigdata01 4096 Oct 16 21:37 stu1
drwx------. 2 stu2 bigdata01 4096 Oct 16 21:37 stu2
drwx------. 2 stu3 bigdata02 4096 Oct 16 21:37 stu3
drwx------. 2 stu4 bigdata02 4096 Oct 16 21:37 stu4

c 创建两个文件夹hadoop和hive,修改用户组,一个为bigdata01,一个为bigdata02,并将文件夹赋予770权限

# 创建文件夹
[root@node02 /tmp]# mkdir hadoop
[root@node02 /tmp]# mkdir hive
[root@node02 /tmp]# ll
total 8
drwxr-xr-x. 2 root root 4096 Oct 16 21:42 hadoop
drwxr-xr-x. 2 root root 4096 Oct 16 21:42 hive
-rw-------. 1 root root    0 Oct 11 17:39 yum.log
# 修改用户组
[root@node02 /tmp]# chown root:bigdata01 hadoop
[root@node02 /tmp]# chown root:bigdata02 hive
[root@node02 /tmp]# ll
total 8
drwxr-xr-x. 2 root bigdata01 4096 Oct 16 21:42 hadoop
drwxr-xr-x. 2 root bigdata02 4096 Oct 16 21:42 hive
-rw-------. 1 root root         0 Oct 11 17:39 yum.log
# 修改文件夹权限为770,这样其他组的成员将无法访问
[root@node02 /tmp]# chmod 770 hadoop
[root@node02 /tmp]# chmod 770 hive
[root@node02 /tmp]# ll
total 8
drwxrwx---. 2 root bigdata01 4096 Oct 16 21:42 hadoop
drwxrwx---. 2 root bigdata02 4096 Oct 16 21:42 hive
-rw-------. 1 root root         0 Oct 11 17:39 yum.log

d 测试,使用stu1进入hadoop是ok的,但是stu1进入hive会被限制,同理stu3进入hive是ok的,但是stu3进入hadoop会被限制。

# 切换stu1
[root@node02 /tmp]# su - stu1
# 可进入hadoop
[stu1@node02 ~]$ cd /tmp/hadoop
[stu1@node02 /tmp/hadoop]$ cd ..
# 无法进入hive
[stu1@node02 /tmp]$ cd hive
-bash: cd: hive: Permission denied
[stu1@node02 /tmp]$ su root
Password: 
# 切换stu3
[root@node02 /tmp]# su stu3
# 可进入hive
[stu3@node02 /tmp]$ cd hive
[stu3@node02 /tmp/hive]$ cd ..
# 不可进入hadoop
[stu3@node02 /tmp]$ cd hadoop
bash: cd: hadoop: Permission denied

这样就完成了实操1的功能。

实操2:在上面案例基础上,在hadoop文件夹下使用stu1创建两个文件,一个可以被stu2读取和修改,另外一个可以被读取但是不能修改。

[root@node02 /tmp]# su stu1
[stu1@node02 /tmp]$ ll
total 8
drwxrwx---. 2 root bigdata01 4096 Oct 16 21:42 hadoop
drwxrwx---. 2 root bigdata02 4096 Oct 16 21:42 hive
-rw-------. 1 root root         0 Oct 11 17:39 yum.log
[stu1@node02 /tmp]$ cd hadoop/
[stu1@node02 /tmp/hadoop]$ ll
total 0
# stu1用户下创建两个文件
[stu1@node02 /tmp/hadoop]$ touch file1.txt
[stu1@node02 /tmp/hadoop]$ touch file2.txt
# 分别给两个文件留下stu1签名
[stu1@node02 /tmp/hadoop]$ echo "stu1 come here and sign" >> file1.txt
[stu1@node02 /tmp/hadoop]$ echo "stu1 come here and sign" >> file2.txt
[stu1@node02 /tmp/hadoop]$ cat file1.txt 
stu1 come here and sign
[stu1@node02 /tmp/hadoop]$ cat file2.txt 
stu1 come here and sign
[stu1@node02 /tmp/hadoop]$ ll
total 8
-rw-r--r--. 1 stu1 bigdata01 24 Oct 16 21:53 file1.txt
-rw-r--r--. 1 stu1 bigdata01 24 Oct 16 21:53 file2.txt
# 修改file1.txt权限为组内可读可写
[stu1@node02 /tmp/hadoop]$ chmod 760 file1.txt
# 修改file2.txt权限为组内只读
[stu1@node02 /tmp/hadoop]$ chmod 740 file2.txt
[stu1@node02 /tmp/hadoop]$ ll
total 8
-rwxrw----. 1 stu1 bigdata01 24 Oct 16 21:53 file1.txt
-rwxr-----. 1 stu1 bigdata01 24 Oct 16 21:53 file2.txt
[stu1@node02 /tmp/hadoop]$ su root
Password: 
[root@node02 /tmp/hadoop]# su stu2
[stu2@node02 /tmp/hadoop]$ ll
total 8
-rwxrw----. 1 stu1 bigdata01 24 Oct 16 21:53 file1.txt
-rwxr-----. 1 stu1 bigdata01 24 Oct 16 21:53 file2.txt
# stu2用户尝试对file1.txt进行修改成功
[stu2@node02 /tmp/hadoop]$ echo "stu2 come here and sign" >> file1.txt
# stu2用户尝试对file2.txt进行修改失败
[stu2@node02 /tmp/hadoop]$ echo "stu2 come here and sign" >> file2.txt
# 不允许
bash: file2.txt: Permission denied
# file1留下了stu2的签名
[stu2@node02 /tmp/hadoop]$ cat file1.txt 
stu1 come here and sign
stu2 come here and sign
# file2依然只有stu1的签名
[stu2@node02 /tmp/hadoop]$ cat file2.txt 
stu1 come here and sign

以上为linux下权限的相关知识,供参考。

参考博文:

(1)https://www.cnblogs.com/garfieldcgf/p/8323489.html

(2) https://www.cnblogs.com/okokabcd/p/8724263.html

(3) https://www.cnblogs.com/52py/p/9598237.html 记录sudo日志配置

(4) https://blog.csdn.net/sinat_36118270/article/details/62899093 在sudoers里设置普通用户

原文地址:https://www.cnblogs.com/youngchaolin/p/11687710.html