DreamHost 主机存在的安全隐患

Dreamhost 的空间已经用了个把月了(使用Fenng 的折扣代码购买 ),最欣赏的是它为用户提供登录Shell,在授权内可以运行绝大部分shell 命令,甚至允许添加cron job,让你在最大限度内保留自有主机的使用习惯。不过在带来灵活性的同时,如果使用不慎,风险也随之而来。下面是新建帐号系统默认建立的目录以及权限设置: [hostname]$ pwd /home/yourname [hostname]$ ls -l total 28 drwx--S---...

Dreamhost 的空间已经用了个把月了(使用Fenng折扣代码购买 ),最欣赏的是它为用户提供登录Shell,在授权内可以运行绝大部分shell 命令,甚至允许添加cron job,让你在最大限度内保留自有主机的使用习惯。不过在带来灵活性的同时,如果使用不慎,风险也随之而来。下面是新建帐号系统默认建立的目录以及权限设置:

[hostname]$ pwd
/home/yourname
[hostname]$ ls -l
total 28
drwx--S---   6 yourname groupname 4096 2006-12-27 04:29 Maildir
drwxr-x--x  33 yourname groupname 4096 2007-02-03 06:07 domain.com
drwxr-sr-x   3 root       root      4096 2006-12-26 15:50 logs

目录domain.com 是对应虚拟主机网站所属的根目录,当前的权限位是drwxr-x--x(751),网站如果希望被正常访问,所需的最小权限位是d--x--x--x(111)。而一般网站都有动态内容生成,比如使用cgi,那么作为运行此cgi 进程的用户则需要对相关目录和文件具有写权限,最小权限位是drwx--x--x(711)。

在深入讨论前,先回顾一下Unix 文件权限位的作用,如果你非常熟悉,请跳过。

每一个文件有10个标识位,第一位d代表目录,空(-)代表文件。其后9位分成三组,分别代表当前用户、同组用户、任何登录用户所对应的权限。r: 读权限,w: 写权限,x: 执行权限。这三种权限对于一个文件都很好理解,对于目录,如果拥有r读权限,可以列出目录下的文件,具有目录的w写权限和x执行权限,可以在目录中增加和删除文件。对于目录具有x执行权限,可以使用cd 命令进入此目录。

下面列出一些可能被误解的权限设置。 

例子一: 

drwx----wx /dir
-rwx------ /dir/1.txt

这种权限,虽然其他人无法列出目录dir 中的文件,也无法读取文件1.txt,但是如果已知文件名1.txt,依然可以删除文件,因为Unix 实际把目录也作为一个文件看待,目录实际保存了文件列表,对目录具有写权限就意味可以修改这个列表。

例子二:

drwx-----x /dir
drwx-----x /dir/dir2
-rwx---r-- /dir/dir2/1.txt

对于这种权限,其他人无法通过列目录方式获知文件路径/dir/dir2/1.txt ,但如果已知此路径,就可以读出文件内容。

安全漏洞 

默认的,Dreamhost 为你的home 目录设置如下权限:

[hostname]$ pwd
/home/yourname
[hostname]$ ls -ld .
drwxr-x--x  9 yourname groupname 4096 2007-02-03 06:00 .
 

这保证了任何本组以外的用户无法列出你的home 目录文件,但并不保证无法列出home 目录以下的子目录,这依赖于你的权限设置,而大多数用户都设置了一个非常宽松的权限。有关Dreamhost用户组的设置,下一个小节会讨论。

例子二就是本文讨论的目的,前面说过,对于网站所属的目录,为了保证正常浏览,对于所有目录都要求设置一个最小权限d--x--x--x(111),同时对于网站目录中的cgi 文件,我们通常设置为drwxr-xr-x(755),如果一个不怀好意者拥有一个与你相同主机上的shell 帐户,可以通过猜测或者其它途径获得你的敏感文件路径,然后使用以下命令轻松获得你的敏感信息,比如,人们通常把movable type 系统的数据连接信息保存在文件mt-config.cgi 中。

$ cat /home/yourname/yourdomain.com/mt/mt-config.cgi 

对于上面的安全问题,我有2种解决方法,一种是让人无法获知敏感文件的准确路径,但是这种方法非常具有局限性,即使实现,管理成本也很高。Dreamhost 已存在的一个安全漏洞使大部分未觉察的用户都暴露在此风险下。另一种方法是小心的配置敏感文件的权限,而对于非敏感文件则可以不作考虑。比如对于mt-config.cgi 文件,应该设置权限-rw-------(600),此文件虽然具有cgi 扩展名,不过仅仅是一个配置文件,只要保证以你的帐户身份运行的cgi 程序可以读取此文件即可。对于其它类似的敏感文件可根据情况进行类似权限设置。

更多的讨论

Dreamhost 允许用户建立多个shell 帐户,如果你打算同其他人share 你的host 空间,或者为你的朋友提供hosting,大概就需要为他们创建shell 登录帐户。默认的,这些新建的帐户将与你自己的帐户拥有相同的group,这个默认行为提供了一定的便利性,但也似乎无法改变,需要引起注意。应该根据情况,小心的为你自己的目录和文件设置组权限,并提醒与你share 主机的朋友做好自己的组权限设置(你们在同一个group 内),权限rwxrwx--- 黄底色的部分将影响到你们之间的关系。

如果确定了一个自己认为安全的权限位,并且适合大多数情况,则可以将此权限写入默认设置,使新建的目录和文件自动拥有此设置。这通过umask 命令 实现,并将其写入自己的profile 中。在Dreamhost 此文件位于 /home/yourname/.bash_profile, 并具有如下默认设定:

umask 002
此设置下,默认新建的目录具有权限drwxrwxr-x(775),文件具有权限-rw-rw-r--(664)。

计算数值命令 bc

$ echo 2*3 | bc6$ export var1=`echo 2*3|bc`$ echo $var16...
$ echo 2*3 | bc
6

$ export var1=`echo 2*3|bc`
$ echo $var1

6

get only filename from fullpath

$ basename '/tmp/test/abc.sh'abc.sh...
$ basename '/tmp/test/abc.sh'
abc.sh

du: check files or directories size

check files or directories size $ du -sk /home/zy87    /home/zy-s calculates the total disk usage for all...

check files or directories size 

$ du -sk /home/zy
87    /home/zy


-s calculates the total disk usage for all specified files and directories.

-k calculates in 1024-byte unites, by default, it will calculate in block count(512-byte in most)

$ du -ak /home/zy
23      ../zy/m1
52      ../zy/m2
1       ../zy/crm/global_brand_prod.bcp
4       ../zy/crm/crm.ksh
1       ../zy/crm/in_files
7       ../zy/crm/l_global_brand_prod.sql
12      ../zy/crm
87      ../zy


-a calculates each files and directories specified.


difference in Double quotes and Single quotes

In unix shell or commands, we often use Double Quotes (") and Single Quotes ('), but...

In unix shell or commands, we often use Double Quotes (") and Single Quotes ('), but we should understand when we must use Double Quotes or we must use Single Quotes, or we could choose either.

  • Single Quotes ('): Shell will send it to Unix Commands without doing any interpretation.
  • Double Quotes ("): Shell will send it to Unix Commands after doing interpretation on following characters
    • Doller Signs ($)
    • Back Quotes (`)
    • Backslashs (\)
  • Backslashs (\) is the same as Single Quotes (') to the next character followed this Backslash.

For understanding the points above, we must understand the 2 different things: Shell and Unix Commands.

We issue all Unix Commands within Unix Shell environment. Shell will interpret (or say process) strings and variables first before they are sent to Unix Commands. For example: echo, ls are Unix Commands, you will issue these commands in an Unix Shell, like Boune Shell, Kane Shell, etc.

Practice 

$ ls
file1 file2
$ echo file*
file1 file2
$ echo "file*"
file*
$ echo $HOME
/home/zhangy
$ echo "$HOME"
/home/zhangy
$ echo '$HOME'
$HOME

Continue to read to see a sample.

Refer to

继续阅读 "difference in Double quotes and Single quotes" 的剩余内容

Shell 编程学习笔记(二)

Match multi-tab replace all of 1 or more TAB with write space in file, it seems...

Match multi-tab

replace all of 1 or more TAB with write space in file, it seems "+" doesn't work in sed cmd.

$ sed 's/[    ][    ]*/ /g' file

Unknown write space number

To get the trailer number 3 from a file like this:

cat test.dat
A.B.C.D.E.A.B.C.D.E
A.B.C.D.E.A.B.C.D.E
A.B.C.D.E.A.B.C.D.E
COUNT       3

The write spaces between COUNT and the number 3 are unknown.

Use:

tail -1 test.dat | cut -d' ' -f2- | tr -d ' '
tail -1 test.dat
COUNT       3
tail -1 test.dat | cut -d' ' -f2-
3
tail -1 test.dat | cut -d' ' -f2- | tr -d ' '
3

自己编写脚本, 让DB2 的命令行安装变得更轻松

正文在Linux平台下DB2 UDB V8.1提供了命令行和图形界面两种安装方式,图形界面虽然通过交互简化了安装的复杂性,但安装过程需要人工干预,耗时相对较长,并且在内核较新的Linux版本下还存在无法启动GUI安装界面的问题,虽然可以通过设置环境变量进行解决,还是显得有些麻烦。当然如果你用命令行方式手动安装就不存在这个问题,不过需要手动完成很多步骤,如果安装或卸载比较频繁的情况下,就不如把整个安装过程写入shell脚本执行方便。下面是我完成的一个用于安装和卸载的shell脚本,在数据库安装时,只需指定安装文件的源路径,即可完成全部安装。包括创建必要的用户和组,创建DAS服务以及实例,在系统注册服务名和服务端口,设置注册表变量,设置自动启动等。另外可以通过三个可选的参数指定忽略拷贝安装文件,或者忽略创建用户或者组,以节约安装时间。卸载功能可以用于卸载使用本安装脚本安装的数据库,包括删除实例和DAS服务,清除前面创建的用户和组,恢复系统的配置文件等,可通过可选的参数指定同时删除安装时拷贝的package文件。在脚本的开始部分,有一些参数可以自行根据实际环境修改,比如要创建的实例名、用于DAS的用户名及组名、数据库的默认建立路径等,在使用本脚本之前可以先进行修改。将本脚本保存为文件,本例存为instdb.sh,添加可执行属性,在root权限下运行,例如:使用源路径'/mnt/DB2UDB8FORLINUX' 进行安装;# ./instdb2 -d /mnt/DB2UDB8FORLINUX删除已经进行的DB2安装,同时删除所有已经拷贝到安装目录的package文件。# ./instdb2 -d /mnt/DB2UDB8FORLINUX -remove -all本文中脚本在如下环境测试通过:RedHat Enterprise Linux 3.0DB2 V8.1...

正文

在Linux平台下DB2 UDB V8.1提供了命令行和图形界面两种安装方式,图形界面虽然通过交互简化了安装的复杂性,但安装过程需要人工干预,耗时相对较长,并且在内核较新的Linux版本下还存在无法启动GUI安装界面的问题,虽然可以通过设置环境变量进行解决,还是显得有些麻烦。

当然如果你用命令行方式手动安装就不存在这个问题,不过需要手动完成很多步骤,如果安装或卸载比较频繁的情况下,就不如把整个安装过程写入shell脚本执行方便。

下面是我完成的一个用于安装和卸载的shell脚本,在数据库安装时,只需指定安装文件的源路径,即可完成全部安装。包括创建必要的用户和组,创建DAS服务以及实例,在系统注册服务名和服务端口,设置注册表变量,设置自动启动等。

另外可以通过三个可选的参数指定忽略拷贝安装文件,或者忽略创建用户或者组,以节约安装时间。

卸载功能可以用于卸载使用本安装脚本安装的数据库,包括删除实例和DAS服务,清除前面创建的用户和组,恢复系统的配置文件等,可通过可选的参数指定同时删除安装时拷贝的package文件。

在脚本的开始部分,有一些参数可以自行根据实际环境修改,比如要创建的实例名、用于DAS的用户名及组名、数据库的默认建立路径等,在使用本脚本之前可以先进行修改。

将本脚本保存为文件,本例存为instdb.sh,添加可执行属性,在root权限下运行,例如:

使用源路径'/mnt/DB2UDB8FORLINUX' 进行安装;

# ./instdb2 -d /mnt/DB2UDB8FORLINUX

删除已经进行的DB2安装,同时删除所有已经拷贝到安装目录的package文件。

# ./instdb2 -d /mnt/DB2UDB8FORLINUX -remove -all

本文中脚本在如下环境测试通过:

  • RedHat Enterprise Linux 3.0
  • DB2 V8.1 for Linux

参考资源

  • IBM DB2 开发者园地
    http://www-128.ibm.com/developerworks/cn/db2/

  • IBM DB2 信息中心
    http://publib.boulder.ibm.com/infocenter/db2help/index.jsp

  • 《DB2 UDB v8.1 for Linux, UNIX, Windows 数据库管理》George Baklarz, Bill Wong 合著,机械工业出版社出版

  • 《DB2数据库管理与应用教程》庄济诚 著,清华大学出版社出版

Shell 编程学习笔记

在当前shell中而不是子Shell中执行cmd.sh程序: $ source cmd.sh 或者 $ . cmd.sh test 用于测试一个表达式的返回值: if test "$1" = "abc" ...

在当前shell中而不是子Shell中执行cmd.sh程序:

$ source cmd.sh 

或者

$ . cmd.sh

test 用于测试一个表达式的返回值:

if test "$1" = "abc" 
then
cmd
fi

可以用[]代替'test'关键字:

if [ "$1" = "abc" ]
then
cmd
fi

但[后和]前必须留有空格,等号两边也要留空格。
一些比较运算符:前面一列用于整形数据,后面一列用于字符串数据

-lt <
-gt >
-lq >=
-gq <=
-ne !=
-eq =

其他参数:

-n "str" 串是否不为空
-e "filename" 文件是否存在
-f "filename" 文件是否是普通文件
-d "filename" 是否是目录

shell后面的参数:

$# 参数的个数,不包括命令本身
$? 最后一个进程返回值
$0 命令本身
$1 第一个参数,依次类推:$2,$3...
$@ 所有的参数,形如:"$1" "$2" "$3" ...
$$ 包含当前进程ID
$! 最后一个后台进程的ID

可以用如下shell取出传入参数:

#!/bin/bash
if [ $# -lt 6 ]
then
echo usage: -a para1 
echo [-b para2] [-c para3]
exit 0
fi
for element in #@
do
if [ "$1" = "-a" ]
then
var1="$2"
elif [ "$1" = "-b" ]
then
var2="$2"
elif [ "$1" = "-c" ]
then
var3="$2"
fi
shift # 改变参数的引用,$2变成$1, $3变成$2 ...
done

注意:shift命令将会改变'$@'的值,循环结束后,'$@'值变为null。

有关awk的使用:

### m.tmp ###
table1
table2
...
#############

把m.tmp文件中的每一行前后插入字符串,并写回文件:

cat m.tmp | awk '{ print "delete from " $1 ";" }' > m.tmp

避免交互过程,一次性设定新密码:

echo "newpasswd" | passwd --stdin username

从命令行读入:

#!/bin/sh
while true
do
echo "are you sure to do this? [y/n]"
read str
if [ "$str" = "y" -o "$str" = "Y" ]
then
break
if [ "$str" = "n" -o "$str" = "N" ]
then
exit 0
else
continue
fi
done

read 后面可以不声明变量,则用户输入会写入默认变量$REPLY.

 

mail.png


标签订阅|Tag Subscription

If you use an RSS reader, you can subscribe to a feed of all future entries tagged 'Shell'. [What is this?]

Subscribe to feed Subscribe to feed

最近更新|Recent Entries

不定期更新|Handy Entries

其它标签|Other Tags

分类栏目|Categories

按月归档|By Month

2008
11
10
07
05
04
03
02
01
2007
12
10
07
06
05
04
03
02
01
2006
12
11
10
09
08
07
06
05
04
03
02
01
2005
11
10
09
08
07
04
03
2004
12
11
10
09
08
07
06
05
04
03
02
01
2003
12
10
09
08
06
2002
09
08
04
03
02
2001
12
09
07
06
05

站内链接|Site Links

Powered by
Movable Type 3.34