一.linux文件的安全与权限
Linux文件的属性:
zhyfly: ~/sixiang$ ls -all
total 54
代码:
drwxr-xr-x 2 zhyfly zhyfly 192 2005-03-03 11:31 .
drwxr-xr-x 36 zhyfly zhyfly 1976 2005-03-08 16:20 ..
-rw-r--r-- 1 zhyfly zhyfly 5186 2005-02-28 13:03 1
-rw-r--r-- 1 zhyfly zhyfly 4819 2005-02-28 13:04 2
-rw-r--r-- 1 zhyfly zhyfly 5096 2005-02-28 13:05 3
-rw-r--r-- 1 zhyfly zhyfly 18923 2005-02-28 13:41 4
-rw-r--r-- 1 zhyfly zhyfly 3120 2005-02-28 13:43 5
-rw-r--r-- 1 zhyfly zhyfly 1411 2005-02-28 13:43 6
其中:
总用量 54:是ls所列出的入口占用空间的字节数(以K为单位)。
该文件的权限位
第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。
补充:
代码:
-rwxrw-r-- 1 root admin 34890 10月 19 20:17 httpd.conf
1.文件类型:文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出.
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
2.文件权限:前三位:rwx:它的所有者是root,即就是文件所有者,它对httpd.conf这个文件的权限是读写执行;
中间三位:rw-:表示admin组对这个文件的权限是读写
后面位:r--:就是即不是所有者,也不是属组的对文件的权限是读
3.umask及文件权限:先讓我們看看 x,r,w 的 bit 位元表示方式﹕
x: 001
w: 010
r: 100
如果將全部位元做 OR 運算就是最終 permission﹕rwx 的位置都是 111 ﹐換成十進位就是 7 了。
下面您如果輸入﹕
chmod 750 test.ls
您會發現權限會變成﹕rwxr-x---﹐至於為什麼會如此﹐不妨算算看﹕
1) 將 750 換成二進位﹐就是﹕111,101,000
2) 分別將 rwx 的位置代入得﹕rwx,r-x,---
(方法﹕1 對應著的權限就打開﹐0 對應的就關閉)
就這麼簡單 ^_^
好
了﹐我們剛纔已經會得計算自己對一個檔案擁有什麼樣的權限﹐也知道如何改變檔案的權限設定。但是﹐檔案被建立的時候﹐預設會獲得怎樣的權限呢﹖這個值就要
靠 umask ?頉Q定了。如果您現在輸入 umask﹐會得到 022 的值﹐這個值決定了檔案在建立的時候﹐要拿掉什麼樣的權限。在沒有使用
umask 的時候﹐所建立的檔案都是 777 這個值的﹐但當運用了 umask 之後呢﹐目錄會變為 755﹐而檔案則為 644
。那是怎麼得出?淼哪丞t還是回到二進位吧﹐然後將完整權限和 umask 進行 NOT 和 AND 運算﹐就是最後的權限值。
在建立目錄的時候﹕
1) 首先﹐我們先對 unmask 進行 NOT 運算﹕
000,010,010 的 NOT 運算結果是﹕111,101,101 ﹔
2) 然後再和 777﹐也就是﹕111,111,111 進行 AND 運算﹔
3) 最後﹐我們會得到這樣的結果﹕111,101,101 ﹔
換成十進位就是 755。
而至於檔案的建立﹕
預設會把它的 x (001) 拿掉﹐其?也是先進行 NOT + AND 運算﹕
1) 先對 x 做 NOT 運算﹕001 NOT ==> 110
2) 然後和 111 做 AND 運算﹕
111,111,111
110,110,110 AND
-----------------
110,110,110 ===> 也就是 666﹐ 然後再和 umask 022 做 NOT 跟 AND 運算﹕
111,101,101 AND
-----------------
110,100,100 ===> 換成十進位是 644 ﹐這才是真正的結果。
我
們的 umask 值是登入的時候﹐由 shell 的 profile 分配的(一般規則是:user 與 group 同名為 022﹐否則是
002)﹐我們可以在任何時候改變這個值﹕用 umask 命令以新的值作參數就可以了﹐如﹕umask 002 ﹐然後新建立的檔案就變成 664
的權限了。
tips﹕如果您不習慣用二進位進行計算﹐只能用十進位?硭愕脑挬o可以簡單的這樣算﹕
目錄是用 777 扣掉 umask 的值﹔
檔案是用 666 扣掉 umask 的值。
不過﹐電腦上面真正的運算是二進位啦﹐這個和我們計算 IP subnet 的時候是一樣的原理。
查看umask的值:
代码:
zhyfly: ~/1$ umask
0022
修改umask的值:
代码:
zhyfly: ~/1$ umask 0002
zhyfly: ~/1$ umask
0002
彻底修改umask的值应修改.profile文件(bash)或.login文件(c shell)
4.修改文件权限chmod:使用chmod来改变权限位
这一命令有符号模式和绝对模式。
符号模式
chmod命令的一般格式为:
chmod [who] operator [permission] filename
w h o的含义是:
代码:
u 文件属主权限。
g 属组用户权限。
o 其他用户权限。
a 所有用户(文件属主、属组用户及其他用户)。
o p e r a t o r的含义:
p e r m i s s i o n的含义:
代码:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组set-ID。
t 粘性位*。
l 给文件加锁,使其他用户无法访问。
u,g,o 针对文件属主、属组用户及其他用户的操作。
*在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。
"t"权限用在文件上面是没有意义的,不是什么在交换区的概念,它跟文件的执行没有关系,而主要是为了文件共享设置的。
代码:
chmod a-x temp //rw- rw- rw- 收回所有用户的执行权限
chmod og-w temp //rw- r-- r- - 收回属组用户和其他用户的写权限
chmod g+w temp //rw- rw- r- - 赋予属组用户写权限
chmod u+x temp //rwx rw- r- - 赋予文件属主执行权限
chmod go+x temp //rwx rwx r- x 赋予属组用户和其他用户执行权限
绝对模式
chmod命令绝对模式的一般形式为:
chmod [mode] file
其中m o d e是一个八进制数。
在绝对模式中,权限部分有着不同的含义。每一个权限位用一个八进制数来代表,如
代码:
0 4 0 0 文件属主可读
0 2 0 0 文件属主可写
0 1 0 0 文件属主可执行
0 0 4 0 属组用户可读
0 0 2 0 属组用户可写
0 0 1 0 属组用户可执行
0 0 0 4 其他用户可读
0 0 0 2 其他用户可写
0 0 0 1 其他用户可执行
在设定权限的时候,只需按照上面查出与文件属主、属组用户和其他用户所具有的权限相对应的数字,并把它们加起来,就是相应的权限表示。
可以看出,文件属主、属组用户和其他用户分别所能够具有的最大权限值就是7。
e.g
代码:
-rwxr--r-- 1 root 0 10月 19 20:16 temp
相应的权限:
代码:
rwx-:0400 + 0200 +0100 (文件属主可读、写、执行) = 0 7 0 0
r--:0 0 4 0 (属组用户可读) = 0 0 4 0
r--:0 0 4 0 (属组用户可读) = 0 0 4 0
0 7 4 4
有一个计算八进制权限表示的更好办法,如下:
代码:
文件属主:r w x:4 + 2 + 1
属组用户:r w x:4 + 2 + 1
其他用户:r w x:4 + 2 + 1
这上面这相,更容易地计算出相应的权限值,只要分别针对文件属主、属组用户和其他用户把相应权限下面的数字加在一起就可以了。
temp文件具有这样的权限:
4+2+1 4 4
把相应权限位所对应的值加在一起,就是7 4 4。
如:
代码:
chmod 666 rw- rw- rw- 赋予所有用户读和写的权限
chmod 644 rw- r-- r- - 赋予所有文件属主读和写的权限,所有其他用户读权限
chmod 744 rwx r-- r- - 赋予文件属主读、写和执行的权限,所有其他用户读的权限
chmod 664 rw- rw- r- - 赋予文件属主和属组用户读和写的权限,其他用户读权限
chmod 700 rwx --- --- 赋予文件属主读、写和执行的权限
chmod 444 r-- r-- r- - 赋予所有用户读权限
下面举一个例子,假定有一个名为temp的文件,具有如下权限:
代码:
-rw-rw-r-- 1 root 0 10月 19 20:16 test1
现在希望对该文件可读、写和执行, root组用户对该文件只读,可以键入:
代码:
$chmod 740 test1
$ls -l
-rwxr----- 1 root 0 10月 19 20:16 test1
如果文件可读、写和执行,对其他所有用户只读,用:
代码:
$chmod 744 test1
$ls -l
-rwxr--r-- 1 root 0 10月 19 20:16 test1
如果希望一次设置目录下所有文件的权限,可以用:
代码:
$chmod 664*
$ls -l
-rw-r--r-- 1 root 0 10月 19 20:16 test1
这将使文件属主和属组用户都具有读和写的权限,其他用户只具有读权限。
还可以通过使用- R选项连同子目录下的文件一起设置:
这样就可以一次将/ temp目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和属组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。
5.修改文件属主chown:c h o w n命令的一般形式为:
代码:
chmod -R -h owner file
- R选项意味着对所有子目录下的文件也都进行同样的操作。
- h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。
chown举例
如:
代码:
# ls -l
drwxrwxr-x 2 sam sam 4096 10月 26 19:48 sam
# chown gem sam
# ls -l
drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam
文件sam的所有权现在由用户sam交给了用户gem。
6.修改文件属组chgrp:chgrp举例
c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。
代码:
# ls -l
drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam
# chgrp group sam
# ls -l
drwxrwxr-x 2 gem group 4096 10月 26 19:48 sam
现在把该文件sam所属的组由sam变为group。
找出你所属于的用户组
如果你希望知道自己属于哪些用户组,可以用ID这个命令:
代码:
# su sam
$ id
uid=506(sam) gid=4(adm) groups=4(adm)
找出其他用户所属于的组
代码:
# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
查看当前用户所属组
代码:
# id gem
uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
查看其它用户所用组:#id 用户名
代码:
# su sam
$ id gem
uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
查看其它用户所属组
7.suid/sgid为什么要使用这种类型的脚本?
例
如有几个着几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的g u i
d,这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,
他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。
查找suid/sgid命令
有相当一些U N I X命令也设置了s u i d和s g i d。如果想找出这些命令,可以进入/ b i n或/ s b i n目录,执行下面的命令:
代码:
$ ls -l | grep '^...s'
上面的命令是用来查找s u i d文件的;
代码:
$ ls -l | grep '^...s..s'
上面的命令是用来查找s u i d和gs g i d的。
设置UID
代码:
设置s u i d:将相应的权限位之前的那一位设置为4;
设置g u i d:将相应的权限位之前的那一位设置为2;
两者都置位:将相应的权限位之前的那一位设置为4+2=6。
设置了这一位后x的位置将由s代替。
记住:在设置s u i d或s g i d的同时,相应的执行权限位必须要被设置。
例如,如果希望设置s g i d,那么必须要让该用户组具有执行权限。
如果想要对文件l o g i n[它当前所具有的权限为rwx rw- r-- (741)]设置s u i d,,可在使用c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s rw- r - -。
设置suid/sgid的例子
代码:
命令 结果 含义
chmod 4755 rws r-x r- x 文件被设置了s u i d,文件属主具有读、写和执行的权限,其他用户具有读和执行的权限
chmod 6711 rws --s --x 文件被设置了s u i d和g u i d,文件属主具有读、写和执行的权限,其他用户具有执行的权限
chmod 4764 rws rw- r- - 文件被设置了s u i d,文件属主具有读、写和执行的权限,属组用户具有读和执行的权限,用户具有读权限
还可以使用符号方式来设置s u i d / s g i d。如果某个文件具有这样的权限: rwx r-x r- x,那么可以这样设置其s u i d:
于是该文件的权限将变为: rws r-x r-x
在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。
它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。
注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本.
8.符号链接存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)
软链接文件
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚
至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。
命令格式:
代码:
ln -s source_path target_path
硬链接文件
info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是
代码:
ln [-d] existfile newfile
硬链接文件有两个限制
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改.
补充:Linux的用户和用户组管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个惟一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下几个方面:
· 用户账号的添加、删除与修改。
· 用户口令的管理。
· 用户组的管理。
9.Linux系统用户账号的管理用户账号的管理工作主要涉及到用户账号的添加、修改和删除。
添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。
a.添加新的用户账号使用useradd命令,其语法如下:
其中各选项含义如下:
代码:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
用户名 指定新账号的登录名。
例1:
代码:
# useradd –d /usr/sam -m sam
此命令创建了一个用户sam,
其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录)。
例2:
代码:
# useradd -s /bin/sh -g group –G adm,root gem
此命令新建了一个用户gem,该用户的登录Shell是/bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。
这里可能新建组:#groupadd group及groupadd adm
增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。
Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。
b.删除帐号
如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。删除一个已有的用户账号使用userdel命令,其格式如下:
常用的选项是-r,它的作用是把用户的主目录一起删除。
例如:
此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。
c.修改帐号
修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
修改已有用户的信息使用usermod命令,其格式如下:
常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外,有些系统可以使用如下选项:
这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
例如:
代码:
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。
d.用户口令的管理
用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:
可使用的选项:
代码:
-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令。
例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:
代码:
$ passwd
Old password:******
New password:*******
Re-enter new password:*******
如果是超级用户,可以用下列形式指定任何用户的口令:
代码:
# passwd sam
New password:*******
Re-enter new password:*******
普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。
为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。
为用户指定空口令时,执行下列形式的命令:
此命令将用户sam的口令删除,这样用户sam下一次登录时,系统就不再询问口令。
passwd命令还可以用-l(lock)选项锁定某一用户,使其不能登录,例如: