Archive for 九月, 2011

深入理解linux的权限设置和SUID,SGID以及粘滞位

我们知道文件的权限可以用三个八进制数字表示。其实文件的权限应该用四个八进制来表示,不过用 ls -l 命令时,只显示三个罢了。那个没有显示的八进制数字其实是第一个,它用来设定一些特殊权限。这个八进制数字的三个位是:

SUID SGID sticky-bit

它们的含义是:

SUID 当设置了

SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

SGID 与上面的内容类似。文件运行时,运行者将具有所属组的特权。

sticky-bit sticky 位要求操作系统既是在可执行程序退出后,仍要在内存中保留该程序的映象。这样做是为了节省大型程序的启动时间。但是会占用系统资源。因此设置该位,不如把程序写好。

set uid ;set gid;sticky bit区别

每一个文件有所有者及组编号,set uid ;set gid可以改变用户对文件具有的权限:写和执行.

setuid: 在执行时具有文件所有者的权限.
setgid: 设置目录. 一个目录被标上setgid位,此目录下创建的文件继承该目录的属性.
sticky bit: 该位可以理解为防删除位. 设置sticky bit位后,就算用户对目录具有写权限,但也只能添加文件而不能删除文件。
如何设置:

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u+s temp — 为temp文件加上setuid标志. (setuid 只对文件有效,U=用户)
chmod g+s tempdir — 为tempdir目录加上setgid标志 (setgid 只对目录有效,g=组名)
chmod o+t temp — 为temp文件加上sticky标志 (sticky只对文件有效)

2) 采用八进制方式. 这一组八进制数字三位的意义如下,
abc
a – setuid位, 如果该位为1, 则表示设置setuid
b – setgid位, 如果该位为1, 则表示设置setgid
c – sticky位, 如果该位为1, 则表示设置sticky

设置后, 可以用 ls -l 来查看. 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
如:

rwsrw-r– 表示有setuid标志 (rwxrw-r–:rwsrw-r–)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)

理解文件权限

所谓的文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操作系统,它允许多个用户同时登录和工作。因此 Linux 将一个文件或目录与一个用户和组联系起来。请看下面的例子:

drwxr-xr-x 5 root root 1024 Sep 13 03:27 Desktop

与文件权限相关联的是第一、第三、第四个域。第三个域是文件的所有者,第四个域是文件的所属组,而第一个域则限制了文件的访问权限。在这个例子中,文件的所有者是 root,所属的组是 root,文件的访问权限是 drwxr-xr-x。对于文件和目录讲,每个文件和目录都有一组权限标志和它们结合在一起,在上例中就是第一个域中的内容。下面来仔细分析这个域中各个符号的意义:

该域由 10 个字符组成,可以把它们分为四组,具体含义分别是:

d rwx r-x r-x

文件类型 所有者权限标志 组权限标志 其他用户权限标志

其中:

文件类型:第一个字符。由于 Linux 系统对与设备、目录、文件都当作是文件来处理,因此该字符表明此文件的类型,字符与对应的意义如下表:

文件标志

文件类型

例子

普通文件

数据文件、

ASCII 纯文本文件、程序

d 目录

/bin
b 块设备

/dev/hda(第一个 IDE 硬盘)
c 字符设备

/dev/ttyS1(与 DOS 种的串口等同)
s 套接字

/dev/log
p 命名管道

/dev/initctl(与“|”等同)
l 符号链接

/dev/modem->/dev/ttyS1

权限标志:

对每个文件或目录都有 4 类不同的用户。每类用户各有一组读、写和执行(搜索)文件的访问权限,这 4 类用户是:

root:系统特权用户类,既 UID = 0 的用户。

owner:拥有文件的用户。

group:共享文件的组访问权限的用户类的用户组名称。

world:不属于上面 3 类的所有其他用户。

作为 root,他们自动拥有了所有文件和目录的全面的读、写和搜索的权限,所以没有必要明确指定他们的权限。其他三类用户则可以在耽搁文件或者目录的基础上别授权或撤消权限。因此对另外三类用户,一共 9 个权限位与之对应,分为 3 组,每组 3 个,分别用 r、w、x 来表示,分别对应 owner、group、world。

权限位对于文件和目录的含义有些许不同。每组 3 个字符对应的含义从左至右的顺序,对于文件来说是:读文件的内容(r)、写数据到文件(w)、做为命令执行该文件(x)。对于目录来说是:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连接)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件或子目录)。具体来说就是:

1. 有只读权限的用户不能用 cd 进入该目录;还必须有执行权限才能进入。

2. 有执行权限的用户只有在知道文件名并拥有该文件的读权限的情况下才可以访问目录下的文件。

3. 必须有读和执行权限才可以使用 ls 列出目录清单,或使用 cd 进入目录。

4. 如用户有目录的写权限,则可以创建、删除或修改目录下的任何文件或子目录,既是该文件或子目录属于其他用户。

修改文件权限

首先讲修改文件的所有权,使用 chown 和 chgrp 命令:

chown new_user file or directory:修改文件或目录的所有者。

chgrp new_group file or directory:修改文件或目录的所属组。

这里需要注意的是:普通用户不能将文件或目录的所有权交与他人,只有 root 有这一权限。但是普通用户有权改变文件或目录的所属组。

由于每类用户的权限都是由 rwx 三位组成,因此可以用三个八进制数字表示文件的访问权。一个八进制数字可以用三个二进制数字表示,那么与其对应,权值为 4 的位对应 r,权值为 2 的位对应 w,权值为 1 的位对应 x。对于一类用户,将这三位与其对应的权值相乘求和,就可以得出对该类用户的访问权限。

改变文件访问权限的命令是 chmod,格式是:

chmod permission file_name

比如 chmod 764 a.txt,它表示对于文件的所有者,具有对该文件读、写、执行的权限。对于文件所属组的用户,拥有读、写的权限。对于其他用户,只有读权限。

这里需要注意的是:文件的创建者是唯一可以修改该文件访问权限的普通用户,另外一个可以修改文件访问权限的用户是 root。

还有一种表示方法,就是用字符串来设定文件访问权限。其中读用 r 表示,写用 w 表示,执行用 x 表示;所有者用 u 表示,组用户用 g 表示,其他用户用 o 表示,所有用户用 a 表示。那么上面例子就写成西面的模样:

chmod a+r,u+w,u+x,g+w a.txt

理解 SUID 和 SGID

在上面的章节中,我们知道了文件的权限可以用三个八进制数字表示。其实文件的权限应该用四个八进制来表示,不过用 ls -l 命令时,只显示三个罢了。那个没有显示的八进制数字其实是第一个,它用来设定一些特殊权限。这个八进制数字的三个位是:

SUID SGID sticky-bit

它们的含义是:

SUID 当设置了

SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

SGID 与上面的内容类似。文件运行时,运行者将具有所属组的特权。

sticky-bit sticky 位要求操作系统既是在可执行程序退出后,仍要在内存中保留该程序的映象。这样做是为了节省大型程序的启动时间。但是会占用系统资源。因此设置该位,不如把程序写好。

zz from: http://hi.baidu.com/%B5%DA%C8%FD%B4%FA%B9%BA%CE%EF/blog/item/647c6b8bbe33af17c8fc7af2.html

记得小时候去南京雨花台,觉得那里的雨花石很漂亮,很喜欢。外面恰好有商贩在卖雨花石,十块钱两大把。视若珍宝的带回家,好像都没舍得分给别的小朋友。

过了几年,或许是雨花石失去了它的光泽,也或许是我失去了对它的珍爱,沉甸甸的石头变得累赘。于是随手摆放,渐渐没剩下几块。

再之后,来北京读书,更是不会带着它们了。至今,已忘记它们是否还躲在家里的某个角落了。

雨花石如此,现在我们执着的一切,也一样,都会沿着十二因缘法流转,都会成住坏空。比如,如果我吝惜银行里的存款,不花、也不捐助别人,它会贬值,甚至有其他无常。而我自己,亦无常,空了之后,钱是钱,我是我。

师父也说了,不依止他人、由自产生的,才是恒常的。我暂时达不到只享受法喜的程度,但是由慈悲喜舍而得到的喜悦,我相信,已经比世俗的喜悦要大大地趋近于法喜了。

所以,换一个角度,我努力通过正当的途径赚到钱,自己适度使用,并随缘布施,在财布施的同时,也将平等、欢喜心分享出去,这样,我将收获很多快乐,更会将佛法实践,从而更好地修行。

生活处处皆佛法,以上是中午饭后散步10分钟的感悟。阿弥陀佛!

在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM)。此工具包最先是由Red Hat公司推出的,后来被其他Linux开发商所借用。由于它为Linux使用者省去了很多时间,所以被广泛应用于在Linux下安装、删除软件。下面就给大家介绍一下它的具体使用方法。

1.我们得到一个新软件,在安装之前,一般都要先查看一下这个软件包里有什么内容,假设这个文件是:Linux-1.4-6.i368.rpm,我们可以用这条命令查看:

rpm -qpi Linux-1.4-6.i368.rpm

系统将会列出这个软件包的详细资料,包括含有多少个文件、各文件名称、文件大小、创建时间、编译日期等信息。

2.上面列出的所有文件在安装时不一定全部安装,就像Windows下程序的安装方式分为典型、完全、自定义一样,Linux也会让你选择安装方式,此时我们可以用下面这条命令查看软件包将会在系统里安装哪些部分,以方便我们的选择:

rpm -qpl Linux-1.4-6.i368.rpm

3.选择安装方式后,开始安装。我们可以用rpm-ivh Linux-1.4-6.i368.rpm命令安装此软件。在安装过程中,若系统提示此软件已安装过或因其他原因无法继续安装,但若我们确实想执行安装命令,可以在 -ivh后加一参数“-replacepkgs”:

rpm -ivh -replacepkgs Linux-1.4-6.i368.rpm

4.有时我们卸载某个安装过的软件,只需执行rpm-e <文件名>命令即可。

5.对低版本软件进行升级是提高其功能的好办法,这样可以省去我们卸载后再安装新软件的麻烦,要升级某个软件,只须执行如下命令:rpm -uvh <文件名>,注意:此时的文件名必须是要升级软件的升级补丁

6.另外一个安装软件的方法可谓是Linux的独到之处,同时也是RMP强大功能的一个表现:通过FTP站点直接在线安装软件。当找到含有你所需软件的站点并与此网站连接后,执行下面的命令即可实现在线安装,譬如在线安装Linux-1.4-6.i368.rpm,可以用命令:

rpm -i ftp://ftp.pht.com/pub/linux/redhat/…-1.4-6.i368.rpm

7.在我们使用电脑过程中,难免会有误操作,若我们误删了几个文件而影响了系统的性能时,怎样查找到底少了哪些文件呢?RPM软件包提供了一个查找损坏文件的功能,执行此命令:rpm -Va即可,Linux将为你列出所有损坏的文件。你可以通过Linux的安装光盘进行修复。

8.Linux系统中文件繁多,在使用过程中,难免会碰到我们不认识的文件,在Windows下我们可以用“开始/查找”菜单快速判断某个文件属于哪个文件夹,在Linux中,下面这条命令行可以帮助我们快速判定某个文件属于哪个软件包:

rpm -qf <文件名>

9.当每个软件包安装在Linux系统后,安装文件都会到RPM数据库中“报到”,所以,我们要查询某个已安装软件的属性时,只需到此数据库中查找即可。注意:此时的查询命令不同于1和8介绍的查询,这种方法只适用于已安装过的软件包!命令格式:

rpm -参数 <文件名>

zz from: http://hi.baidu.com/mnkee/blog/item/efcb08467f4b950e6b63e538.html

————————————————-

改变默认安装路径:

首先用下面的命令查看一下该RPM包的默认安装目录,例如:

$ rpm -qpl ext3grep-0.10.0-1.el5.rf.i386.rpm
/usr/bin/ext3grep
/usr/share/doc/ext3grep-0.10.0
/usr/share/doc/ext3grep-0.10.0/INSTALL
/usr/share/doc/ext3grep-0.10.0/LICENSE.GPL2
/usr/share/doc/ext3grep-0.10.0/NEWS
/usr/share/doc/ext3grep-0.10.0/README

上面的命令列出了每一个文件即将被安装的位置,现在我们只需要重新用–relocate参数把安装目录定位一下就可以了:
rpm -i --relocate /usr/bin=/home/mysql/bin --relocate /usr/share/doc=/home/mysql/doc ext3grep-0.10.0-1.el5.rf.i386.rpm

今天拿到合作方提供的几台服务器,我相信其配置是经过考虑的。其中有mysql数据库服务器和apache的web服务器。

mysql服务器配置:

硬盘不大,但是做了几个分区,其中u01和var都可以用作数据库分区。通过mysql create table的DATA DIRECTORY和INDEX DIRECTORY指令就可以指定表和索引的存储位置。

[admin@v080103 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             15G  420M   14G   4% /
/dev/xvda12            18G  173M   17G   2% /u01
/dev/xvda7            8.6G  148M  8.0G   2% /tmp
/dev/xvda6            9.5G  151M  8.9G   2% /home
/dev/xvda5             15G  2.8G   11G  21% /usr
/dev/xvda3             15G  309M   14G   3% /var
/dev/xvda1            122M   13M  103M  12% /boot
tmpfs                 3.9G     0  3.9G   0% /dev/shm

内存:8G,swap8G。

系统和web服务器一样,都是redhat企业2.6.18版本。

硬盘读写速度测试如下:

写速度:

[root@v080103 ~]# time dd if=/dev/zero of=/u01/dd-tmp bs=64k count=10000
10000+0 records in
10000+0 records out
655360000 bytes (655 MB) copied, 1.02116 seconds, 642 MB/s

real    0m1.024s
user    0m0.000s
sys     0m1.020s

读速度:
[root@v080103 ~]# time dd if=/u01/dd-tmp of=/dev/zero bs=64k
10000+0 records in
10000+0 records out
655360000 bytes (655 MB) copied, 0.21607 seconds, 3.0 GB/s

real    0m0.219s
user    0m0.000s
sys     0m0.208s

读写速度:
[root@v080103 ~]# time dd if=/u01/dd-tmp of=/u01/dd-tmp2 bs=64k
10000+0 records in
10000+0 records out
655360000 bytes (655 MB) copied, 0.974636 seconds, 672 MB/s

real    0m0.978s
user    0m0.020s
sys     0m0.948s

测试加上buffer和cache以后的读速度:

[root@v080103 ~]# /sbin/hdparm -tT /dev/xvda12
/dev/xvda12:
Timing cached reads:   22996 MB in  1.99 seconds = 11546.19 MB/sec
Timing buffered disk reads:  346 MB in  3.01 seconds = 115.08 MB/sec

内核及cpu信息(more /proc/cpuinfo):4核,2.4GHz,cache size是12288 KB。

web服务器配置:

仅列举与mysql服务器不同的配置。

硬盘为90G,仅有根分区可用。

[root@v080105 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             87G   18G   65G  22% /
/dev/xvda1             99M   19M   76M  20% /boot
tmpfs                 3.9G     0  3.9G   0% /dev/shm

内存8G,禁止了swap。

附之前租用服务器的配置:

flykobe@server ~ $ dd if=/home/yicheng/dd-tmp of=/dev/zero bs=64k
10000+0 records in
10000+0 records out
655360000 bytes (655 MB) copied, 0.339296 seconds, 1.9 GB/s

flykobe@server ~ $ dd if=/home/yicheng/dd-tmp of=/home/yicheng/dd-tmp2 bs=64k
10000+0 records in
10000+0 records out
655360000 bytes (655 MB) copied, 2.9816 seconds, 220 MB/s

flykobe@server ~ $ rm dd-tmp*
flykobe@server ~ $ df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00 445G  170G  253G  41% /
/dev/mapper/ddf1_4c5349202020202080862682000000004711471100001450p1 99M   13M   82M  14% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm

flykobe@server ~ $ sudo /sbin/hdparm -tT /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00:
Timing cached reads:   19028 MB in  2.00 seconds = 9537.51 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device
Timing buffered disk reads:  126 MB in  3.20 seconds =  39.42 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device

——————-

查看主板信息:

dmidecode |less
Handle 0x0005
DMI type 2, 20 bytes.
Base Board Information
Manufacturer: Intel Corporation
Product Name: D945GPM
Version: AAD25924-102
Serial Number: AZPM61102417

2011年已过大半,又到十一长假时,略作总结。

今年是特殊的一年,在2010年末的总结里,我写的悲壮,要拿2011去拼我的未来。现在看来,那时把事情想的太豪迈、也太严重了。

今年最大的收获,是从春末夏初开始学佛。在北京佛教协会和广化寺举办的佛学初级、中级研修班学习至今,算是初步建立了正信。对待人生、苦的态度,不是逃避、抵触、反抗,而是面对它、解决它。佛教不是消极的,也不是盲目的乐观,是建立在了知因果基础之上的自信、自觉、觉行圆满。学佛,不是理论的,而是理论与实践的结合,在生活中践行佛法。

时至今日,同事、朋友已经感觉到了我的改变,我自己也可以感觉到。但是更重要的是,我了解到,路还很长,得继续修行。

与同事的相处,由年初的剑拔弩张,到现在基本融洽,亦是多亏佛法。

技术方面的收获,列举如下:

  • 明确了对前端没有兴趣,js、css、html仅仅是在迫不得已而为之,以后不准备在这方向上发展,因为若要继续,就得了解W3C的规则、浏览器的差别、浏览器渲染、执行的原理等。时间有限,故舍弃。
  • 服务器配置方面有了一些进步,LAMP系统搭建了几次,MySql的主从备份也做过了,性能优化也遇到几次,针对几个项目做了服务器的迁移。目前已经有六台服务器,下一步准备搭建一个小型网络。
  • php应用开发方面,尝试了几种不同的代码风格,进行了一些重构和自动化测试的尝试。
  • 代码的性能优化方面,还是决定着力于缓存和NoSQL的使用,因为缓存相对于数据库是简单和易见效的,先吃透这个(必要时会去看源码),再想其他。方法应该是多找找成熟大网站缓存使用的例子,学习加实践。
  • 面对性能、功能问题的时候,会从apache、PHP、mysql的设计原理、架构角度考虑,快速定位到问题并解决(理解还不算深)。

下半年,希望:

  • 最好能招一个前端(js、css、html+php应用层),这样我可以解放出来,进行架构和优化。
  • 搭建小型网络,最大限度的压榨服务器的性能。
  • 做到写缓存,数据库的读写分离,主从数据库都承载请求。
  • 适当做一些数据分析。

服务器迁移后,有一个下载文件的功能出了点小问题,一开始是缺少ZipArchive类,那么按照zip.so即可。再然后是目录权限的问题,赋予该目录httpd运行者可读写的权限即可。

再然后是报错:Cannot modify header information – headers already sent by filename。而下载文件的内容以乱码形式直接打印在页面上。

既然代码是一致的,在测试环境和旧服务器环境可运行,那么就应该是配置的问题了。

由于可下载文件的header是在代码中显示输出的,如:

//Begin writing headers
header(“Pragma: public”);
header(“Expires: 0″);
header(“Cache-Control: must-revalidate, post-check=0, pre-check=0″);
header(“Cache-Control: public”);
header(“Content-Description: File Transfer”);
//Use the switch-generated Content-Type
header(“Content-Type: application/zip”);
//Force the download
$header=”Content-Disposition: attachment; filename=”.$zip_file_name_base.”;”;
header($header );
header(“Content-Transfer-Encoding: binary”);
header(“Content-Length: “.$len);

如果之前有输出了,header就无效了。但是代码在输出header前有显示调用ob_end_clean啊。这时再去看php.ini中与buffer相关的设置,就发现output_buffering off,即一有输出,就发送到网络对端用户浏览器,这样ob_end_clean就无效了,而后面输出的header content_type也无效了,被下载文件的内容当然就直接打印在页面上了。

解决方法:

一种是修改output_buffering,比如为4096。由于我们的应用没有那种需要即时输出的功能,所以采用此种做法。

另外一种更好的方法,就是保证header前不要有别的输出,这样更优雅。

如果一台服务器上有多个php版本,比如默认的是/usr/local/php,而我们使用的是/home/admin/apps/php,那么在安装ext的时候,就需要如下执行:

~/apps/admin/php/bin/phpize

./configure ~/apps/admin/php/bin/php-config

make && make install

读《故道白云》有感。

早起拈香一柱,左手持香,右手点火。左手自然成兰花状,拇指与食指轻轻拈住香。这时感知到,若太用力,则香断;若太轻,则香落。中道亦如是。常说中道很难,其实仍然以拈香为例。最开始不知道香的重量、韧度,不知道该用多大力气拈住它。而假以时日,拈香已成为常态。

所以,欲行中道,需要从了解自身习性为开始。怎样了解?就需要念住。

《故道白云》里悉达多行禅、坐禅,最后了悟后说,要念住于当下。现在师父教我们坐禅,其实也是在一个较为容易的环境和状态下练习念住。

坐禅前的经行,先站立,身与意感知重心平稳,而后重心微微右移,抬左脚、左腿、迈出,沿虚空向前,落下,脚尖或脚跟着地,慢慢全脚着地,重心左移,抬右脚、右腿…… 我的感觉是,这时应当弱化(不是完全舍弃)眼耳鼻舌根,专注于身与意,即这时练习以身根、意根为切入点的念住。

同理,禅坐随息时,我的感觉是,弱化眼耳舌身,专注于鼻和意(这里,没特别分清楚,觉知呼吸的是鼻根还是身根),即练习以鼻根、意根为切入点的念住。

再比如我们练习过的吃的禅修,就是以舌根、意根为切入点。

当比较顺利地调服了单独的某一根时,就可以练习同时念住在综合的觉知上了。

apache 的error log中有时会针对某些特定ip出现client denied by server configuration。

该错误提示出现在modules/aaa/mod_authz_host.c中,由find_allowdeny函数判断是否有权限访问url对应的文件。其判断的标准除了httpd.conf中的Deny和Allow之外,还有IP和HOST。所以怀疑是由于这些ip频繁访问而导致的。

这时再查看httpd.conf,发现有这样的配置:

<IfModule mod_evasive20.c>
DOSHashTableSize    8000
DOSPageCount        4
DOSSiteCount        100
DOSPageInterval     1
DOSSiteInterval     1
DOSBlockingPeriod   10
DOSWhitelist 121.0.31.*
DOSWhitelist 121.0.29.*
</IfModule>

所以,这个是apache的mod_evasive模块提供的DOS功能!具体的配置可以参考:http://www.linuxsir.org/main/node/244

1、搭建起小服务器网络,并做到扩展、迁移、部署的便捷性。

2、搭建一套服务器监视系统,监视服务器和应用的健康程度。

3、做到写缓存,数据库的读写分离,主从数据库都承载请求。

4、详细记录每一点滴,并知其所以然。