Linux的文件权限表示其实还是比较简单的。
对于任意一个文件,都可以通过ls -l filename
来查看ta的权限序列。
例如:
-rwxr-xr-x 1 wgjak47 wgjak47 221287 11月 16 2010 aliedit.sh
权限序列的第一位是文件类型:
上例中的文件为-,表示普通文件。
是然后三组rwx,r表示可读,w可写,x可执行,-表示没有权限。
举个例子,如果一个文件属性是754,也就是(rwxr-xr-)。
可以使用chmod改变文件的权限。基本用法如下:
<!-- lang: shell -->
chmod XXXX filename
其中X是8进制数,第一位一般省略,原因下面会说,转化为2进制就正好对应rwx,例如7(111)表示rwx,而5(101)表示r-x。对于目录,可以使用-R选项递归修改其子目录和子文件的属性。另外XXXX也可以使用操作符+符号来改变格式:
- 操作符'+'使得用户选择的权限被追加到每个指定文件,(操作给 指定文件添加所选权限)
- 操作符'-'使得这些权限被撤消;'='使得 指定文件只具有这些权限。
字符串'rwxXstugo':给用户选择新的属性
- (r)读权限
- (w)写权限
- (x)执行权(或对目录的访问权)
- (X)只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性
- (s)同时设定用户或组ID
- (t)粘滞位(保存程序的文本到交换设备上)
因此,'chmod g-s file' 撤消sgid位,'chmod ug+s file'同时设置了suid和sgid位,'chmod o+s file' 则没有进行任何设置
从chmod的man Page当中,我们可以发现,除了rwx三个基本权限,还有s,t两个权限。
展开来说是:setuid、setgid、stick bit (粘贴位)
举个例子:/etc/passwd文件,用于储存用户密码的文件。
-rw-r–r– 1 root root 2090 12月 23 20:29 /etc/passwd
我们知道这是储存用户密码的文件,但权限是root才能读写,其它用户只读。而读写这个文件的passwd属性如下:
-rwsr-xr-x 1 root root 47032 2月 17 2014 /usr/bin/passwd
第三个字母s表示的就是setuid,表示提权执行,也就是普通用户运行passwd的时候会以root身份去运行passwd:
在tty1以普通用户启动passwd,tty2执行ps -aux | grep passwd
将得到如下结果:
root 20174 0.0 0.0 64680 1584 pts/23 S+ 23:37 0:00 passwd
执行者为root。
setpid这种权限一般就是为了应对像密码修改这种敏感,要求权限高但是许多普通用户却需要执行的操作而诞生的。
setgid同理,只不过变成了用户组。
stick bit
在Linux中,文件夹的权限作用如下:
r(read):可以读取文件夹内容列表,但如果没有x权限,就只能看到文件名而无法查看其他内容(大小、权限等)
w(write):由于文件夹记录的是其中内容的列表,因此具有w权限即可修改这个列表,前提是拥有x权限可以进入这个目录内。w具体拥有以下几项权限:
建立新的文件或文件夹、
删除已存在的文件或文件夹(无视该文件或文件夹的权限)、
对已存在的文件或文件夹改名、
更改目录内文件或文件夹的位置
x(execute):可以进入该文件夹,没有x权限便无法执行该目录下的任何命令
stick bit(t)属性暂时只用于目录,主要是/tmp目录,tmp属于root,属性为drwxrwxrwt, 但是任何人都可以往里写文件。但是每个用户对于其他人的文件无法删除(root除外)。
简单的说就是当用户在拥有该属性的目录下建立文件或目录时,仅有自己与 root才有权力删除。
在Linux中,由于root用户的权利过大,经常容易误操作造成无法挽回的损失。为了限制root权限,有人提出让普通用户仅在必要的时候获取root权限执行一些操作,平时以普通用户权限工作。于是sudo工具诞生。
sudo的简述:
在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。
sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。
sudo的原理就是利用了setuid属性:
-rwsr-xr-x 1 root root 155008 2月 11 2014 /usr/bin/sudo
sudo的工作流程大致如下:
sudo在执行时,系统会读取/var/run/sudo/%HOME%/下是否有用户的时间戳文件,若存在的并文件过期的话,系统则会提示用户输入自身的密码
验证成功后,系统会继续查找/etc/sudoers的相关配置,来判断用户的sudo具体权限
若权限存在,会自动会由当前用户切换到其他或root用户下,执行权限操作
执行完成后,再返回当前用户。
sudo的配置文件编辑方式有些类似与crontab,sudoers并不能直接编辑,而是通过visudo来编辑的。visudo类似于crontab -e,也是先复制一个副本(/etc/sudoer.tmp),保存副本之后在更新/etc/sudoer。
sudoers的语法:
root ALL=(ALL) ALL
第一项是用户名,表示哪一个用户可以使用sudo。
第二项是登陆者的主机名,表示可以接受的远程登陆的主机名。ALL表示root可以从从任何一台主机以root身份登陆到本机并使用sudo。
第三项表示可以通过sudo切换的身份,ALL表示可以通过sudo切换任何身份执行命令。
第四项表示可以执行的命令,ALL表示所有命令,如果要特别声明命令,必须使用绝对路径,而且还支持参数和通配符。不同的命令使用','分割。
鸟哥书上的例子:
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root # ! 表示不能执行(黑名单)
如果要添加一个可以使用sudo的用户,那么就另起一行,即可。
例如wgjak47 ALL=(ALL) ALL
%sudo ALL=(ALL) ALL
这样配置的化,只要在sudo用户组内的用户都可以使用sudo。
二、免密码操作
sudo默认是需要密码的,而且只支持交互式的输入,当然可以通过expect或者有名管道模拟这个过程。但是将密码明文写在脚本中是很不安全的(索尼就是这么死的),而且我们一般只希望对于某些操作免密码,而不是所有操作。
sudoer支持NOPASSWD关键字:例如你希望运行service操作时面密码,可以这样配置:
username ALL=(ALL) NOPASSWD:/sbin/service
这样你在脚步中以sudo运行service就不需要密码了。
三、主机,用户,命令管理(alias)
为了方便管理,可以将用户,主机名,和命令打包成别名,方便管理:
鸟哥的例子改一下
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z], !/usr/bin/passwd root
Host_Alias THO = .threebody.com
ADMPW THO=(root) ADMPWCOM
注意Linux是严格区分大小写的,一定要注意开头的字母大写。