linux安全配置之权限篇

发布时间:2020-08-01编辑:脚本学堂
本文介绍下,linux安全配置之权限设置的相关内容,介绍了文件权限位的设置,默认权限设置,文件系统属性设置等。有需要的朋友作个参考。

1,权限 ugo ( r - w - x )
当一个用户访问一个文件的时候
1、如果当前用户的UID与文件owner的UID匹配,那么就遵守第一个三位组的权限,如果不匹配那么看GID
2、如果当前用户的GID与文件group的GID匹配,那么就遵守第二个三位组的权限
3、如果当前用户的UID与GID和文件的owner与group都不匹配,那么就看第三个三位组other的权限。
了解到匹配权限的过程之后,接下来学习三位组中rwx的具体含义。
 

文件 目录
r 浏览(cat) 浏览(ls)
w 编辑(vim) 创建/删除(touch,rm)
x 执行(script) 改变(cd)
- 无 无

2,默认权限与umask
默认情况下,管理员的umask 022,普通用户的umask 002。
下面以文件默认权限是666,umask是033,来介绍一个文件的权限。
1).666的权限是rw- rw- rw-,换算成2进制 110 110 110
2).umask033 权限是 --- -wx-wx ,换算成2进制 000 011 011
3).umask 2进制取反 000 011 011 -------->111 100 100
4).umask 取反后的2进制和默认权限做与运算
 

umask 111 100 100
默认权限 110 110 110
--------------------------------------
110 100 100
rw- r-- r--

5).得到最终的权限 644
 
3.SUID SGID Sticky
可执行文件SUID SGID
执行可执行文件的时候,不以执行者的身份去运行,而是以文件所属人(组)的身份去执行目录。
SGID Sticky
SGID:当一个A目录具有SGID的时候,在这个目录下新建的文件文件夹默认所属组会是A目录的所属组。
Sticky:当A目录具有Sticky位的时候,在A目录下的文件只有文件的所属人才能够删除文件,其他人哪怕对A目录有写的权限也不能删。
 
设置suid和SGID
给文件加SUID和SGID的命令如下:
 

chmodu+s filename 设置SUID位
chmodu-s filename 去掉SUID设置
chmodg+s filename 设置SGID位
chmodg-s filename 去掉SGID设置

注意:
大部分 UNIX 类系统都会忽略掉shell/ target=_blank class=infotextkey>shell脚本的 suid ,只有二进制可执行程序的 suid 有效 。所以直接给脚本文件设置 suid 是达不到预期效果的。
例如,有shell脚本 apk.sh,即使执行命令 #chmod 4755 apk.sh ,系统也会忽略该脚本的SUID位。
所以如果确实需要给脚本文件设 suid,常见的做法是用 C 写一个封装程序,在这个程序里调用脚本。
这样,给封装程序(二进制可执行程序)设上 suid(chmod 4755 a.out) 即可达到给脚本文件设suid的效果。

4,ext3文件系统属性
chattr lsattr
 
lsattr   [-aR]
参数说明:
-a  :将隐藏文件的属性也显示出来
-R  :连同子目录的数据一并显示出来
 
chattr  [+-=] [ASacdistu]  [文件或目录名称]
A:当设定了属性A,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免诸如笔记本电脑容易产生磁盘I/O错误的情况;
S:这个功能有点类似sync,是将数据同步写入磁盘中,可以有效避免数据流失;
a:设定a后,这个文件将只能增加数据而不能删除,只有root才能设定这个属性;
c:设定这个属性后,将会自动将此文件压缩,在读取时自动解压缩。但是在存储的时候,会现进行压缩在存储(对于大文件很有用);
d:当dump(备份)程序执行时,设定d属性将可使该文件(或目录)具有dump功效;
i:这个参数可以让一个文件”不能被删除、更名、设定链接,也无法写入数据,对于系统安全有很大的助益
j:当使用ext3文件系统格式时,设定j属性将使文件在写入时先记录在日志中,
但是当filesystem设定参数为data=journalled时,由于已经设定了日志,所以这个属性无效
s:当文件设定了s参数时,它会被完全移出这个硬盘空间
u:与s相反,当使用u配置文件时,数据内容其实还可以存在于磁盘中,可以用来取消删除。
 
测试效果:
1》
 

复制代码 代码示例:
[root@jbxue tmp]#ls
file1
[root@jbxue tmp]#stat file1
  File: “file1”
  Size: 15              Blocks: 16         IO Block: 4096   一般文件
Device:fd00h/64768d    Inode: 163203      Links: 1
Access:(0644/-rw-r--r--)  Uid: (    0/   root)   Gid: (    0/   root)
Access: 2012-12-1015:18:02.000000000 +0800
Modify: 2012-12-1015:19:28.000000000 +0800
Change: 2012-12-1015:19:28.000000000 +0800
[root@jbxue tmp]#lsattr file1
-------A----- file1

注意:Modify和Change的时间都比Access time晚,说明access time 不做更新,但是redhat 6.2 access time更新不及时。
 
2》
 

复制代码 代码示例:
[root@jbxue tmp]#cat file1
diafdsafsafsaf
afdsa
afdsa
[root@jbxue tmp]#echo "afdsa">file1
-bash: file1: 不允许的操作
[root@jbxue tmp]#echo "afdsa">>file1
[root@jbxue tmp]#cat file1         
diafdsafsafsaf
afdsa
afdsa
afdsa
[root@jbxue tmp]#rm -fr file1
rm: 无法删除 “file1”: 不允许的操作

5.文件系统的访问控制列表
 

复制代码 代码示例:
setfacl -m (--modify)u:user:permission file | directory 对文件或者文件夹设置facl权限
setfacl -m (--modify)u:group:permission file | directory 对组设置facl权限
setfacl -m (--modify) d:u:user:permissiondirectory 任何人新建的文件都会变成文件夹所有人
getfacl  file  查看file文件的权限
setfacl -x u:soft  test 去掉单个用户的权限
setfacl -b test  删除test目录的所以acl权限

测试:
1》
 

复制代码 代码示例:
[root@jbxue tmp]# mkdir dir1
[root@jbxue tmp]# chmod 700 dir1/
[root@jbxue tmp]# setfacl -mu:test:rwx dir1
[root@jbxue tmp]# su test
[test@jbxue tmp]$ cd dir1/
[root@jbxue tmp]# setfacl -b dir1/
[root@jbxue tmp]# su test
[test@jbxue tmp]$ cd dir1/
bash: cd: dir1/: 权限不够

linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、关闭、读写这些设备文件,从而对设备进行读写,这种操作就像读写普通的文件一样easy。
linux为不同种类的设备文件提供了相同的接口,比如read(),write(),open(),close()。
 
所以在系统与设备通信之前,系统首先要建立一个设备文件,这个设备文件存放在/dev目录下。
其实系统默认情况下就已经生成了很多设备文件,但有时候我们需要自己手动新建一些设备文件,此时就会用到像mkdir, mknod这样的命令。
mknod 的标准形式为:
mknod DEVNAME {b | c}  MAJOR MINOR
 
1,DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹下,就需要先用mkdir在dev目录下新建一个目录;
 
2, b和c 分别表示块设备和字符设备:
b表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘;
c表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、终端都是以字符的形式传送数据;
 
3,MAJOR和MINOR分别表示主设备号和次设备号:
为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备号,所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1。

用mknod命令来申请设备文件。     
 

复制代码 代码示例:
mkdir -p /dev/cobing
mknod /dev/cobing/mydev1 c 128 512

查看系统设备的主设备号,可以参考/usr/share/doc/kernel-doc-2.6.18/Documentation/devices.txt文件中的说明。
 
文件系统的挂载选项
 

复制代码 代码示例:
noexec  exec
[root@jbxue ~]# mount /dev/hdb1  /test/
[root@jbxue ~]# echo"hello" > /test/file1
[root@jbxue ~]# cp /bin/cat /test/
[root@jbxue ~]# cd /test/
[root@jbxue test]# ./cat file1
hello
[root@jbxue test]# mount -oremount,noexec /test/
[root@jbxue test]# ./cat file1
bash: ./cat: Permission denied
ro        rw
[root@jbxue test]# mount -oremount,ro /test/
[root@jbxue test]# echo"abc" >> /test/file1
bash: /test/file1: Read-only filesystem
nosuid   suid
[root@jbxue test]# mount /dev/hdb1/test/
[root@jbxue test]# ls
cat cdrom  file1  lost+found
[root@jbxue test]# chmod 640 file1
[root@jbxue test]# ls -l file1
-rw-r----- 1 root root 6 Mar  3 16:04 file1
[root@jbxue test]# chmod u+s cat
[root@jbxue test]# su - user1
[user1@jbxue ~]$ cd /test/
[user1@jbxue test]$ ./cat file1
hello
[root@jbxue test]# mount -oremount,nosuid /test/
[root@jbxue test]# su - user1
[user1@jbxue ~]$ cd /test/
[user1@jbxue test]$ ./cat file1
./cat: file1: Permission denied
nodev   dev
[root@jbxue test]# ls -l /dev/cdrom
lrwxrwxrwx 1 root root 3 Mar  3 14:47 /dev/cdrom -> hdd
[root@jbxue test]# ls -l /dev/hdd
brw-rw---- 1 root disk 22, 64Mar  3 14:47 /dev/hdd
[root@jbxue test]# mknod cdrom b 2264
[root@jbxue test]# mount cdrom /mnt/
mount: block device cdrom iswrite-protected, mounting read-only
[root@jbxue test]# umount /mnt/
[root@jbxue test]# mount -oremount,nodev /test/
[root@jbxue test]# ls -l cdrom
brw-r--r-- 1 root root 22, 64Mar  3 16:13 cdrom
[root@jbxue test]# mount cdrom /mnt/
mount: block device cdrom iswrite-protected, mounting read-only
mount: cannot mount block devicecdrom read-only
[root@jbxue test]# ls /mnt/
noauto  auto
[root@jbxue ~]# vim /etc/fstab
/dev/hdb1  /test  ext3  noauto
[root@jbxue ~]# mount -a
noatime atime
Update inode access time foreach  access.  This is  the default.
async    sync