1、合理使用Shell历史命令记录功能ios
在Linux下可经过history命令查看用户全部的历史操做记录,同时shell命令操做记录默认保存在用户目录下的.bash_history文件中,经过这个文件能够查询shell命令的执行历史,有助于运维人员进行系统审计和问题排查,同时,在服务器遭受黑客攻击后,也能够经过这个命令或文件查询黑客登陆服务器所执行的历史命令操做,可是有时候黑客在入侵服务器后为了毁灭痕迹,可能会删除.bash_history文件,这就须要合理的保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。shell
默认的history命令只能查看用户历史操做记录,并不能区分每一个用户操做命令的时间,这点对于排查问题十分不便,不过能够经过下面的方法(加入四行内容)让history命令自动记录全部shell命令的执行时间,编辑/etc/bashrc文件:安全
1
2
3
4
|
HISTFILESIZE=4000
HISTSIZE=4000
HISTTIMEFORMAT=
'%F %T'
export
HISTTIMEFORMAT
|
其中,HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数,默认值是1000,这里设置为4000;HISTSIZE定义了history命令输出的记录总数;HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的“+"%F %T"”是一致的;HISTTIMEFORMAT做为history的时间变量将值传递给history命令。bash
经过这样的设置后,执行history命令,就会显示每一个历史命令的详细执行时间,例如:服务器
1
2
3
4
5
6
7
8
9
10
11
|
[root@server ~]
# history
247 2013-10-05 17:16:28
vi
/etc/bashrc
248 2013-10-05 17:16:28
top
249 2013-10-05 17:04:18 vmstat
250 2013-10-05 17:04:24
ps
-ef
251 2013-10-05 17:16:29
ls
-al
252 2013-10-05 17:16:32 lsattr
253 2013-10-05 17:17:16
vi
/etc/profile
254 2013-10-05 17:19:32
date
+
"%F %T"
255 2013-10-05 17:21:06
lsof
256 2013-10-05 17:21:21
history
|
为了确保服务器的安全,保留shell命令的执行历史是很是有用的一条技巧。shell虽然有历史功能,可是这个功能并不是针对审计目的而设计,所以很容易被黑客篡改或是丢失。下面再介绍一种方法,能够实现详细记录登陆过系统的用户、IP地址、shell命令以及详细操做时间等,并将这些信息以文件的形式保存在一个安全的地方,以供系统审计和故障排查。运维
将下面这段代码添加到/etc/profile文件中,便可实现上述功能。ssh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#history
USER_IP=`
who
-u am i 2>
/dev/null
|
awk
'{print $NF}'
|
sed
-e
's/[()]//g'
`
HISTDIR=
/usr/share/
.
history
if
[ -z $USER_IP ]
then
USER_IP=`
hostname
`
fi
if
[ ! -d $HISTDIR ]
then
mkdir
-p $HISTDIR
chmod
777 $HISTDIR
fi
if
[ ! -d $HISTDIR/${LOGNAME} ]
then
mkdir
-p $HISTDIR/${LOGNAME}
chmod
300 $HISTDIR/${LOGNAME}
fi
export
HISTSIZE=4000
DT=`
date
+%Y%m%d_%H%M%S`
export
HISTFILE=
"$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
export
HISTTIMEFORMAT=
"[%Y.%m.%d %H:%M:%S]"
chmod
600 $HISTDIR/${LOGNAME}/*.
history
* 2>
/dev/null
|
这段代码将每一个用户的shell命令执行历史以文件的形式保存在/usr/share/.history目录中,每一个用户一个文件夹,而且文件夹下的每一个文件以IP地址加shell命令操做时间的格式命名。下面是user01用户执行shell命令的历史记录文件,基本效果以下:工具
1
2
3
4
5
6
7
8
9
10
11
|
[root@server user01]
# pwd
/usr/share/
.
history
/user01
[root@server user01]
# ls -al
-rw------- 1 user01 wheel 56 Jul 6 17:07 192.168.12.12.
history
.20130706_164512
-rw------- 1 user01 wheel 43 Jul 6 17:42 192.168.12.12.
history
.20130706_172800
-rw------- 1 user01 wheel 22 Jul 7 12:05 192.168.12.19.
history
.20130707_111123
-rw------- 1 user01 wheel 22 Jul 8 13:41 192.168.12.20.
history
.20130708_120053
-rw------- 1 user01 wheel 22 Jul 1 15:28 192.168.12.186.
history
.20130701_150941
-rw------- 1 user01 wheel 22 Jul 2 19:47 192.168.12.163.
history
.20130702_193645
-rw------- 1 user01 wheel 22 Jul 3 12:38 192.168.12.19.
history
.20130703_120948
-rw------- 1 user01 wheel 22 Jul 3 19:14 192.168.12.134.
history
.20130703_183150
|
保存历史命令的文件夹目录要尽可能隐蔽,避免被黑客发现后删除。spa
2、合理使用su、sudo命令操作系统
su命令是一个切换用户的工具,常常用于将普通用户切换到超级用户下,固然也能够从超级用户切换到普通用户。为了保证服务器的安全,几乎全部服务器都禁止了超级用户直接登陆系统,而是经过普通用户登陆系统,而后再经过su命令切换到超级用户下,执行一些须要超级权限的工做。经过su命令可以给系统管理带来必定的方便,可是也存在不安全的因素,例如系统有10个普通用户,每一个用户都须要执行一些有超级权限的操做,就必须把超级用户的密码交给这10个普通用户,若是这10个用户都有超级权限,经过超级权限能够作任何事,那么会在必定程度上对系统的安全形成了威协。所以su命令在不少人都须要参与的系统管理中,并非最好的选择,超级用户密码应该掌握在少数人手中,此时sudo命令就派上用场了。
sudo命令容许系统管理员分配给普通用户一些合理的“权利”,而且不须要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其余特许用户才能完成的任务,好比系统服务重启、编辑系统配置文件等,经过这种方式不但能减小超级用户登陆次数和管理时间,也提升了系统安全性。所以,sudo命令相对于权限无限制性的su来讲,仍是比较安全的,因此sudo也被称为受限制的su,另外sudo也是须要事先进行受权认证的,因此也被称为受权认证的su。
sudo执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,而后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而这一切的完成要经过sudo的配置文件/etc/sudoers来进行受权。
例如,/etc/shadow文件普通用户是没法访问的:
1
2
|
[user01@unknown ~]$
more
/etc/shadow
/etc/shadow
: Permission denied
|
若是要让普通用户user01可访问这个文件,能够在/etc/sudoers添加以下内容:
1
2
3
4
|
user01 ALL =
/bin/more
/etc/shadow
这样,经过以下方式user01用户就可访问
/etc/shadow
文件:
[user01@unknown ~]$
sudo
more
/etc/shadow
[
sudo
] password
for
user01:
|
执行这个命令后,须要输入user01用户的密码,而后就可访问文件内容了。在这里sudo使用时间戳文件来完成相似“检票”的系统,当用户输入密码后就得到了一张默认存活期为5分钟的“入场券”(默认值能够在编译的时候改变)。超时之后,用户必须从新输入密码才能查看文件内容。
若是每次都须要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时能够经过下面的设置,让普通用户无需输入密码便可执行具备超级权限的程序。例如,要让普通用户centreon具备/etc/init.d/nagios脚本重启的权限,能够在/etc/sudoers添加以下设置:
1
|
CENTREON ALL = NOPASSWD:
/etc/init
.d
/nagios
restart
|
这样,普通用户centreon就能够执行nagios重启的脚本而无需输入密码了。若是要让一个普通用户user02具备超级用户的全部权限,而又不想输入超级用户的密码,只需在/etc/sudoers添加以下内容便可:
1
|
user02 ALL=(ALL) NOPASSWD: ALL
|
这样user02用户登陆系统后,就能够经过执行以下命令切换到超级用户下:
1
2
3
|
[user02@unknown ~]$
sudo
su
-
[root@unknown ~]
# pwd
/root
|
sudo设计的宗旨是:赋予用户尽量少的权限但仍容许它们完成本身的工做,这种设计兼顾了安全性和易用性,所以,强烈推荐经过sudo来管理系统帐号的安全,只容许普通用户登陆系统,若是这些用户须要特殊的权限,就经过配置/etc/sudoers来完成,这也是多用户系统下帐号安全管理的基本方式。
3、删减系统登陆欢迎信息
系统的一些欢迎信息或版本信息,虽然能给系统管理者带来必定的方便,可是这些信息有时候可能被黑客利用,成为攻击服务器的帮凶,为了保证系统的安全,能够修改或删除某些系统文件,须要修改或删除的文件有4个,分别是/etc/issue、/etc/issue.net、/etc/redhat-release和/etc/motd。
/etc/issue和/etc/issue.net文件都记录了操做系统的名称和版本号,当用户经过本地终端或本地虚拟控制台等登陆系统时,/etc/issue的文件内容就会显示,当用户经过ssh或telnet等远程登陆系统时,/etc/issue.net文件内容就会在登陆后显示。在默认状况下/etc/issue.net文件的内容是不会在ssh登陆后显示的,要显示这个信息能够修改/etc/ssh/sshd_config文件,在此文件中添加以下内容便可:
1
|
Banner
/etc/issue
.net
|
其实这些登陆提示很明显泄漏了系统信息,为了安全起见,建议将此文件中的内容删除或修改。
/etc/redhat-release文件也记录了操做系统的名称和版本号,为了安全起见,能够将此文件中的内容删除。
/etc/motd文件是系统的公告信息。每次用户登陆后,/etc/motd文件的内容就会显示在用户的终端。经过这个文件系统管理员能够发布一些软件或硬件的升级、系统维护等通告信息,可是此文件的最大做用就、是能够发布一些警告信息,当黑客登陆系统后,会发现这些警告信息,进而产生一些震慑做用。看过国外的一个报道,黑客入侵了一个服务器,而这个服务器却给出了欢迎登陆的信息,所以法院不作任何裁决。