一、合理使用Shell历史命令记录功能
Linux下可通过history命令查看用户所有历史操作记录,同时shell命令操作记录默认保存在用户目录下的.bash_history文件中,有时候黑客会删除.bash_history文件,这就需要合理备份.bash_history文件。
下面介绍下history日志文件的安全配置方法。
方法一:
默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间,
可以通过下面方法(加入四行内容)让history命令自动记录所有shell命令的执行时间,编辑/etc/bashrc文件:
HISTFILESIZE=4000 HISTSIZE=4000 HISTTIMEFORMAT='%F %T' export HISTTIMEFORMAT
HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数,默认值是1000,这里设置为4000;
HISTSIZE定义了history命令输出的记录总数;
HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的“+"%F %T"”是一致的;
HISTTIMEFORMAT作为history的时间变量将值传递给history命令。
通过这样的设置后,执行history命令,就会显示每个历史命令的详细执行时间
方法二:
记录登录过系统的用户、IP地址、shell命令以及详细操作时间等,并将这些信息以文件形式保存在一个安全地方。
将下面这段代码添加到/etc/profile文件中,即可实现上述功能。
#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命令的历史记录文件,基本效果如下:
[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
二、合理使用su、sudo命令
su命令是一个切换用户的工具,经常用于将普通用户切换到超级用户下,几乎所有服务器都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过su命令切换到超级用户下,执行一些需要超级权限的工作。
sudo命令允许系统管理员分配给普通用户一些合理的“权利”,比如系统服务重启、编辑系统配置文件等。
sudo执行命令的流程是:将当前用户切换到超级用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,
而这一切的完成要通过sudo的配置文件/etc/sudoers来进行授权。
例如,/etc/shadow文件普通用户是无法访问的:
[user01@unknown ~]$ more /etc/shadow /etc/shadow: Permission denied
如果要让普通用户user01可访问这个文件,可以在/etc/sudoers添加如下内容:
user01 ALL = /bin/more /etc/shadow 这样,通过如下方式user01用户就可访问/etc/shadow文件: [user01@unknown ~]$ sudo more /etc/shadow [sudo] password for user01:
执行这个命令后,需要输入user01用户的密码,然后就可访问文件内容了。
如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以通过下面的设置,让普通用户无需输入密码即可执行具有超级权限的程序。
例如,要让普通用户centreon具有/etc/init.d/nagios脚本重启的权限,可以在/etc/sudoers添加如下设置:
CENTREON ALL = NOPASSWD: /etc/init.d/nagios restart
这样,普通用户centreon就可以执行nagios重启的脚本而无需输入密码了。
如果要让一个普通用户user02具有超级用户的所有权限,而又不想输入超级用户的密码,
只需在/etc/sudoers添加如下内容即可:
user02 ALL=(ALL) NOPASSWD: ALL
这样user02用户登录系统后,就可以通过执行如下命令切换到超级用户下:
[user02@unknown ~]$ sudo su - [root@unknown ~]# pwd /root
三、删减系统登录欢迎信息
为了保证系统的安全,可以修改或删除某些系统文件,需要修改或删除的文件有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文件,在此文件中添加如下内容即可:
Banner /etc/issue.net
为了安全起见,建议将此文件中的内容删除或修改。
/etc/redhat-release文件也记录了操作系统的名称和版本号,为了安全起见,可以将此文件中的内容删除。
/etc/motd文件是系统的公告信息。每次用户登录后,/etc/motd文件的内容就会显示在用户的终端。
四:SSH Iptables访问控制
方法一:
在/etc/hosts.allow中添加允许ssh登陆的ip或者网段
sshd:192.168.1.2:allow 或者
sshd:192.168.1.0/24:allow
在/etc/hosts.deny添加不允许ssh登陆的IP
sshd:ALL #ALL表示除了上面允许的,其他的ip 都拒绝登陆ssh
方法二:
使用iptables。
iptables -A INPUT -p tcp -s 192.168.1.2 --destination-port 22 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
方法三:
修改ssh配置文件
vi /etc/ssh/sshd_config
添加一行:
allowusers [email protected]
注:xxx为你用来登入服务器的用户名。
*********************************************************
隐藏和伪装端口banner http://kangyang.blog.51cto.com/471772/580853
net session /delete /y
Linux服务器被攻击的几个表象:
1.从外部ping延迟高
2.从内部ping网关延迟高
3.内存和CPU占用居高不下
4.通过netstat查看到的状态为SYN_RECV的请求多,且刷新慢
抵挡攻击的方法:
1.设置防火墙规则
1.
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
2.
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
3.
iptables -A FORWARD -p icmp --icmp-
type
echo
-request -m limit --limit 1/s -j ACCEPT
2.封ip和ip段
1.
iptables -I INPUT -s 49.116.15.23 -j DROP
#封单个ip
2.
iptables -I INPUT -s 49.116.15.23/32 -j DROP
#和上一个效果一样,封单个IP
3.
iptables -I INPUT -s 49.116.15.0/24 -j DROP
#封ip段,指定前三段
4.
iptables -I INPUT -s 49.116.0.0/16 -j DROP
#封ip段,只指定前两段
5.
iptables -I INPUT -s 49.0.0.0/8 -j DROP
#封ip段,只指定第一段
3.iptables限制源IP和MAC地址
iptables -I INPUT -s x.x.x.x -p tcp --dport 8080 -m mac --mac-source 11:22:33:44:55:66 -j ACCEPT
在这里有个问题:如何知道该封哪些个ip呢?
答案是 netstat 命令。
通过 netstat查看当前请求,频繁出现且状态为SYN_RECV的ip多是恶意攻击的。
两个方法要结合起来用才能起来显著的效果,这是本人在维护高并发和高流量的投票网站中实践得出的经验。
本文转载:http://ixdba.blog.51cto.com/2895551/1552907
linux下清理日志的脚本
需求:由于/var分区单独划分,给的分区大小才5G,日志写满了,需要写个脚本定时清理日志文件
#!/bin/bash
##delete log script ,write by xl
LOG_DIR1=/var/log
LOG_DIR2=/var/spool/mail
LOG_DIR3=/var/spool/mqueue
ROOT_UID=0
##Must be use root to run this script
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root to run this script."
exit 1
fi
cd $LOG_DIR1 || {
echo "Can not change to necessary dircectory." >&2
exit 1
}
#把空设备重定向到文件里面
cat /dev/null > maillog && echo "Logs cleaned up."
cat /dev/null > maillog.1 && echo "Logs cleaned up."
cat /dev/null > maillog.2 && echo "Logs cleaned up."
cd $LOG_DIR2 || {
echo "Can not change to necessary dircectory." >&2
exit 1
}
cat /dev/null > root && echo "Logs cleaned up."
cat /dev/null > stock && echo "Logs cleaned up."
###清除mqueue下的小文件
cd $LOG_DIR3
ls |xargs rm -rf
1、删除系统默认账户、组 可以删除的用户有:adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher 等 可以删除的组有:adm,lp,news,uucp,games,dip,pppusers,popusers,slopusers 等 [root@localhost ~]# userdel adm # 删除用户命令 [root@localhost ~]# groupdel adm # 删除组命令 ## 如果用户只做服务启动 , 那么最好将登陆 shell 设为 /sbin/nologin 2、关闭不需要的系统服务 可以有选择的关闭这些服务:anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、gpm、 haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscd portmap、readahead_early、 restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswdd ypserv [root@localhost ~]# chkconfig ip6tables off # 关闭开机启动 ## 下面是系统稳定运行必须的服务 acpid 用于电源管理,对于笔记本和台式电脑很重要,建议开启 Apmd 高级电源能源管理服务,可以监控电池 Kudzu 检测硬件是否变化的服务,建议开启 crond 任务计划服务,建议开启 atd 类似 crond ,提供指定时间做指定事情的服务 keytables 用于装载镜像键盘,根据情况,可以启动 iptables Linux 内置防火墙软件,为了系统安全必须启动 xinetd 支持多种网络服务的核心守候进程,建议开启 xfs 使用 X Windows 桌面系统必须的服务 network 激活已配置网络接口的脚本程序,也就是启动网络服务,启动 sshd 提供远程登陆到 Linux 上的服务,为了系统维护方便,你看着办吧 syslog 记录系统日志的服务,很重要,建议开启