Linux权限与sudo

Linux的rwx权限

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

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

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

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

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

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

  • 第一组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也可使用操做符+符号来改变格式:three

  • 操做符'+'使得用户选择的权限被追加到每一个指定文件,(操做给 指定文件添加所选权限)
  • 操做符'-'使得这些权限被撤消;'='使得 指定文件只具备这些权限。

字符串'rwxXstugo':给用户选择新的属性进程

  • (r)读权限
  • (w)写权限crontab

  • (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中,文件夹的权限做用以下:
  • r(read):能够读取文件夹内容列表,但若是没有x权限,就只能看到文件名而没法查看其余内容(大小、权限等)
  • w(write):因为文件夹记录的是其中内容的列表,所以具备w权限便可修改这个列表,前提是拥有x权限能够进入这个目录内。w具体拥有如下几项权限: 创建新的文件或文件夹、 删除已存在的文件或文件夹(无视该文件或文件夹的权限)、 对已存在的文件或文件夹更名、 更改目录内文件或文件夹的位置
  • 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

  • 高级配置 1、群组功能,为了方便管理,sudo支持根据用户群组受权。 例如:

%sudo ALL=(ALL) ALL

这样配置的化,只要在sudo用户组内的用户均可以使用sudo。

2、免密码操做 sudo默认是须要密码的,并且只支持交互式的输入,固然能够经过expect或者有名管道模拟这个过程。可是将密码明文写在脚本中是很不安全的(索尼就是这么死的),并且咱们通常只但愿对于某些操做免密码,而不是全部操做。
sudoer支持NOPASSWD关键字:例如你但愿运行service操做时面密码,能够这样配置:

username ALL=(ALL) NOPASSWD:/sbin/service

这样你在脚步中以sudo运行service就不须要密码了。

3、主机,用户,命令管理(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是严格区分大小写的,必定要注意开头的字母大写。

相关文章
相关标签/搜索