Linux权限与sudo

Linux的rwx权限

Linux的文件权限表示其实还是比较简单的。
对于任意一个文件,都可以通过ls -l filename来查看ta的权限序列。
例如:

-rwxr-xr-x 1 wgjak47 wgjak47 221287 11月 16 2010 aliedit.sh

权限序列的第一位是文件类型:

  • 当为[ d ]则是目录
  • 当为[ - ]则是文件
  • 若是[ l ]则表示为连结档(link file);
  • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);(例如/dev/sda)
  • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。常见于/dev

上例中的文件为-,表示普通文件。

是然后三组rwx,r表示可读,w可写,x可执行,-表示没有权限。

  • 第一组rwx表示文件拥有者的权限
  • 第二组rwx表示文件拥有者所在组中其他人的权限
  • 第三组rwx表示其他人的权限。

举个例子,如果一个文件属性是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)粘滞位(保存程序的文本到交换设备上)
  • (u)目标文件属主
  • (g)目标文件属主所在的组
  • (o)其他用户

因此,'chmod g-s file' 撤消sgid位,'chmod ug+s file'同时设置了suid和sgid位,'chmod o+s file' 则没有进行任何设置

Linux的特殊权限

从chmod的man Page当中,我们可以发现,除了rwx三个基本权限,还有s,t两个权限。
展开来说是:setuid、setgid、stick bit (粘贴位)

  1. setuid、setgid
    简单的说就是如其名字一样,set uid,set gid。当普通用户使用这重属性的文件时会以root/root组的权限执行。

举个例子:/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同理,只不过变成了用户组。

  1. stick bit
    在Linux中,文件夹的权限作用如下:

  2. r(read):可以读取文件夹内容列表,但如果没有x权限,就只能看到文件名而无法查看其他内容(大小、权限等)

  3. w(write):由于文件夹记录的是其中内容的列表,因此具有w权限即可修改这个列表,前提是拥有x权限可以进入这个目录内。w具体拥有以下几项权限:
    建立新的文件或文件夹、
    删除已存在的文件或文件夹(无视该文件或文件夹的权限)、
    对已存在的文件或文件夹改名、
    更改目录内文件或文件夹的位置

  4. x(execute):可以进入该文件夹,没有x权限便无法执行该目录下的任何命令

stick bit(t)属性暂时只用于目录,主要是/tmp目录,tmp属于root,属性为drwxrwxrwt, 但是任何人都可以往里写文件。但是每个用户对于其他人的文件无法删除(root除外)。
简单的说就是当用户在拥有该属性的目录下建立文件或目录时,仅有自己与 root才有权力删除。

setuid与sudo

在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的工作流程大致如下:

  1. sudo在执行时,系统会读取/var/run/sudo/%HOME%/下是否有用户的时间戳文件,若存在的并文件过期的话,系统则会提示用户输入自身的密码

  2. 验证成功后,系统会继续查找/etc/sudoers的相关配置,来判断用户的sudo具体权限

  3. 若权限存在,会自动会由当前用户切换到其他或root用户下,执行权限操作

  4. 执行完成后,再返回当前用户。

sudo的配置和使用:

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支持根据用户群组授权。
    例如:

%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是严格区分大小写的,一定要注意开头的字母大写。

你可能感兴趣的:(Linux权限与sudo)