一 Linux服务器安全与运维
1.账户和登录安全
可删除的默认无用用户:
adm lp sync shutdown halt news uucp operator games gopher
可删除的默认无用组:
adm lp uucp games dip pppusers popusers slipusers
关闭不需要的服务:
anacron auditd autofs avahi-daemon avahi-dnsconfd bluetooth cupspeed 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.
[chkconfig --level 345 anacron off]
将SSH客户端生成的密钥放置服务端 启用Publickey认证
mkdir /home/test/.ssh
chmod 700 /home/test/.ssh
ssh-keygen -i -f test.pub >> /root/.ssh/authorized_key2
vim /etc/ssh/sshd_config
Protocol 2 #仅使用SSH2认证
PubkeyAuthentication yes #启用PublicKey认证
AuthorizedKeysFile .ssh/authorized_key2 #PublicKey文件路径
PasswordAuthentication no #不使用口令认证
/etc/rc.d/init.d/sshd restart
开放普通用户单文件特权 (使用sudo 访问无权限的文件 输入密码后获得5分钟的访问券)
vim /etc/sudoers
test01 ALL = /bin/more /etc/shadow
#无需密码的方式
test01 ALL = NOPASSWD: /etc/init.d/nagios restart
#普通用户提权为超级用户并不需要密码
test01 ALL=(ALL) NOPASSWD: ALL
系统登录欢迎信息
/etc/issue /etc/issue.net /etc/redhat-release /etc/motd
vim /etc/ssh/sshd_config
Banner /etc/issue.net
禁止Ctrl+Alt+Del 关机
centos5.x
vim /etc/inittab
ca::ctrlaltdel:/sbin/shutdown -t3 -r now #将此行注释
telinit q
centos6.x
vim /init/control-alt-delete.conf
exec /sbin/shutdown -r now "Control-Alt-Delete pressed" #注释此行
禁止telnet方式认证登录
vim /etc/ssh/sshd_config
修改shell历史记录长度
vim /etc/bashrc
HISTFILESIZE=10000
HISTSIZE=10000
HISTTIMEFORMAT='%F %T'
export HISTTIMEFORMAT
/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=10000
DT=`date +%Y%m%d_%H%M%s`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DY"
export HISTTIMEFORMAT="{%Y.%m.%d %H:%M:%S}"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
-------------------------------------------------------------
文件权限检查
任何用户都有写权限
find / -type f -perm -2 -o -perm -20 |xargs ls -al
find / -type d -perm -2 -o -perm -20 |xargs ls -al
含有s位的程序
find / -type f -perm -4000 -o -perm -2000 -print |xargs ls -al
查询含有suid和sgid文件
find / -user root -perm -2000 -print -exec md5sum {} \;
find / -user root -perm -4000 -print -exec md5sum {} \;
查询没有属主的文件
find / -nouser -o nogroup
/tmp单独分区时安全的挂载方式
LABEL=/tmp /tmp ext4 rw,nosuid,noexec,nodev 0 0
/tmp是目录的安全挂载方式 [启动loopback文件系统]
dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
mke2fs -j /dev/tmpfs
cp -av /tmp /tmp.old
mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
chmod 1777 /tmp
mv -f /tmp.old/* /tmp
rm -rf /tmp.old
vim /etc/fstab
/dev/tmpfs /tmp ext4 loop,nosuid,noexec,rw 0 0
/dev/shm 安全挂载方式
vim /etc/fstab
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
文件级rootkit
检查文件完整性:Tripwire aide
后门检测工具 chkrootkit
避免chkrootkit依赖的工具被污染提前备份一份完整所需工具至指定目录
mkdir /usr/share/.commands
cp `which --skip-alias awk cut echo find egrep id head ls netstat ps strings sed uname` /user/share/.commands
chkrootkit -p /usr/share/.commands/
检测工具2 RKHunter
#./installer.sh --layout default --install
rkhunter -c
rkhunter --check --skip-keypress #静默检查
09 3 *** root rkhunter --check --cronjob
pidof
2.网络安全运维
Ntop:嗅探网络数据包类型,分析区分数据流量
Ntopng
iperf:网络性能评估工具
iperf3 -c 192.168.12.168
iperf3 -c 192.168.12.168 -t 20 -i 5
iperf3 -c 192.168.12.168 -i 10 -n 5000000000 #每隔十秒发送5G的数据
iperf3 -c 192.168.12.168 -F test.tar.gz -i 5 -t 20 -f M
iperf3 -c 192.168.12.168 -u -b 100M -f M -i 3
nmap:网络发现工具
nmap 39.106.125.107
nmap -T4 -A -v 39.106.125.107
nmap -sn -PE -PS22,80 -PU53
www.baidu.com
PE:发送ICMP echo 报文 PS:发送TCP SYN/ACK的形式侦探主机 PU:以UDP形式侦探
nmap -sU -sS -F
www.myblogsite.top
nmap -O --osscan-guess 192.168.3.1-254
3.数据安全
DRDB
yum -y install kmod-drbd83 drbd83
modprobe drbd
lsmod|grep -i drbd
modprobe -l|grep -i drbd
dd创建空数据: dd if=/dev/zero of=/mnt/testblack.tmp bs=10M count=20
数据恢复extundelete: Linux常用恢复工具:debugfs R-Liunx ext3grep extundelete等.extundelete与ext3grep比较常用,两款工具原理较为相似.前者功能更强大.
通过分析文件系统的日志,解析出所有文件的indoe信息,从而可以恢复Linux下主流的ext3 ext4文件系统下被误删除的文件.而ext3grep仅支持ext3文件系统,此外在恢复速度上前者要更快,是通过扫描inode和数据恢复同时进行,且支持单文件 单目录 inode恢复 block恢复与完整磁盘恢复.而ext3grep略显笨拙需要扫描所有inode信息然后开始恢复数据,速度上相对比较慢且不支持目录 时间恢复等.
前置安装e2fsprogs与e2fsprogs-libs
1.误操作删除需要立即将分区卸载.
2.extundelete /dev/sdc1 --inode 2
3.extundelete /dev/sdc1 --restore-file passwd #单文件恢复
4.extundelete /dev/sdc1 --restore-directory /ganglia-3.4.0 #单目录恢复
5.extundelete /dev/sdc1 --restore-all #全部文件恢复
6.extundelete --after 1379146740 --restore-all /dev/sdc1 #恢复一小时内文件 当前 date +%s-3600
4.Linux系统运维故障排查思路
Linux系统常见无法启动
a.文件系统受损 [ext3 ext4文件系统都是具备日志记录功能的日志文件系统,并且可以进行
简单的容错与纠错.日志文件系统并
不是将数据实时写入到磁盘,而是定期批量写入,但文件系统的所有读写操作都会实时
记录到日志文件中,当系统发生掉电等错误导致数据没有写入磁盘时可以通过日志文件的记录
回滚发生故障的读写操作,从而保证数据和文件系统的
一致性,但是由于实际环境复杂多样导致文件系统不能每一次都可以成功自我修复,这是就需要运维人员手动介入修复.]
掉电开机提示: /dev/sda6 contains a file system with errors,check forced
/dev/sda6:UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY
(or type Control-D to continue):
give root password for maintenance
输入root密码后进入修复模式,使用fsck命令修复.
fsck.ext3 -y /dev/sda6
[无法恢复的数据会存放在文件系统lost+found目录中] (fsck -A -y)
若忘记root密码
centos6.x
1.引导参数中增加 init=/bin/bash 载入系统.
2.mount -o remount,rw / #重挂根
3.passwd #修改密码
4.重启输入root密码继续修复.
centos7.x
1.引导参数中增加 rd.break console=tty0 载入系统
2.mount remount,rw /sysroot #重挂根
3.chroot /sysroot #切换根
4.passwd
5.touch /.autorelabel
6.exit
7.reboot
b.系统文件配置不当或/etc/fstab文件丢失
开机提示: starting system logger
1.开机使用引导介质进入救援模式 [linux rescue]
2.e2label 可查看每个分区对应的挂载点
3.查找出原系统的跟分区目录查找出对应分区 如 /dev/sda3
4.创建一个目录 /rescue_tmp 将原根挂载至此 mkdir /rescue_tmp ;mount /dev/sda3 /rescue_tmp
5.vim /rescue_tmp/etc/fstab
6.恢复完成后重启系统.
c.Linux内核丢失或崩溃
d.引导程序出错
e.硬件故障
f.无响应分析
系统硬件问题: SCSI卡 主板 RAID卡 HBA卡 网卡 硬盘等硬件设备导致,通过更换硬件解决
外围硬件问题: 主要为网络问题导致.网络设备 网络参数等方面查找
软件问题: 系统内核bug 应用软件bug 驱动程序bug等 通过升级内核 修复程序bug 更新驱动程序解决
系统设置问题: 防火墙配置 开机启动不正确等.
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
5.常见故障案例
su 切换普通用户时报错.
报错提示: su: warning: cannot change directory to /home/oracle: Permission denied
su: /bin/bash: Permission denied
排查思路:
-
用户目录权限存在问题ls -ld /home/oracle
-
su 程序权限存在问题ll /bin/su
-
程序依赖的共享库问题ldd /bin/su
-
SELinux问题grep "SELINUX" /etc/selinux/config
-
系统根分区问题检查剩余容量检查根分区权限
创建文件提示: Cannot make directory: file:/www/data/html
[Read-only file system]
原因比较多,可能是文件系统数据块出现不一致导致,也可能是磁盘故障导致.可以尝试fsck修复
1.卸载无法写入的磁盘.
2.若有占用则查询占用端口 fuser -m /dev/sdb1 查找出占用进程
3.停止进城后卸载目录
4.进行修复 fsck -V -a /dev/sdb1
5.重新挂会
操作大量文件时遇到 Argument list too long getconf ARG_MAX 控制传递参数
手动分批删除
find传递删除
shell脚本循环删除
重新编译linux内核 include/liunx/binfmts.h文件 #define MAX_ARG_PAGES 32 将32改为64或128.重新编译
inode消耗殆尽
dumpe2fs -h /dev/sda3|grep 'Inode count'
文件删除后空间不释放: 文件存放分为数据部分和指针部分,指针部分位于文件系统的meta-data中,将数据清除后指针从meta-data中被清除.将数据对应的指针清除后空间随之释放.
进程占用不断的写数据导致
Too many open files
ulimit -n
[/etc/security/limits.conf]
www soft nofile 65535
www hard nofile 65535
内核文件大小限制
进程数据块大小限制
shell进程创建文件大小限制
可加锁内存大小限制
常驻内存集的大小限制
打开文件句柄数限制
分配堆栈的最大大小限制
CPU占用时间限制用户最大可用的进程数
shell进程所能使用的最大虚拟内存限制
No speace left on device:mod_rewrite:could not create rewrite_log_lock Configyration Failed
信号量占尽. ipcs -s |grep nobody|perl -e 'while (<STDIN> { @a=split(/\s+/); print `ipcrmsem $a[1]`})'
6.轻量级运维利器pssh pdsh mussh
并行ssh运维工具pssh parallel-ssh 支持文件并行复制/远程并行执行命令/杀死远程主机进程等
& 需要保证本地主机与管理服务器之间单向信任
& Python版本大于2.4
& 附带5个主程序
ssh(pssh) 远程主机并行运行命令
scp(pscp) 复制文件至远程多台主机
rsync(prsync) 使用rsync协议将文件从本地同步到远程多台主机
nuke(pnuke) 在远程主机并行killall某进程
slurp(pslurp) 将文件从远程主机复制到本地
查看user002 003的时间
pssh -H
opsuser@user002.bestbook.com:9529 -P date
pssh -H
user003.bestbook.com -i date
批量管理列表 /etc/pssh/hosts
批量下发命令
获取运行时间
pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime" -O "StrictHostKeyChecking=no" 让远程主机自动接受本地hostkey
解压文件
passh -i -h /etc/pssh/hosts "tar -xzvf test.zip"
连接指定端口
passh -i -x "-l opsuser" "-p 9529" -h /etc/pssh/hosts -o /etc/pssh/info "uptime;name-a"
本地文件推送给批量远端
pscp -h /etc/pssh/hosts /etc/ssh/ssh_config /tmp
pscp -h /etc/pssh/hosts -r /etc/httpd/conf /tmp
本地拉取远端文件
pslurp -h /etc/pssh/hosts -L /home/opsuser/test > /home/opsuser/gmond.conf gmond1.conf
pslurp -h /etc/pssh/hosts -r -L /home/opsuser/test > /home/opsuser/gmond gmond1
本地文件同步到远程主机
prsync -h /etc/pssh/hosts -l opsuser -a -r /etc/httpd /tmp
prsync -h /etc/pssh/hosts -l opsuser -az -r /var/log/httpd /tmp #压缩传输
杀死远端进程
punke -h /etc/pssh/hosts httpd
分布式运维工具pdsh parallel distributed shell 适用于大批量服务器配置/部署/文件复制/运维等操作
& 需要保证本地主机与管理服务器之间的单向信任
& 默认rsh方式 支持ssh mrsh qsh mqsh krb4 xcpu 等多种rcmd模块
& --with-ssh --with-dshgroups --with-machines --with-dshgroups
& 传输文件时 本地与远端都必须安装pdcp
批量统计信息
pdsh -w ssh:192.168.16.[1-3] "uname -n"
pdsh -w ssh:user00[1-5] -x user003 "uptime"
pdsh -w ssh:user00[10-31],/15/ "uptime"
文件批量调用
/etc/pdsh/machines
pdsh -R ssh -a uptime
pdsh -R ssh -g userhosts uptime
pdsh -R ssh -a -X userhosts uptume
交互模式
pdsh -R ssh -w user001
文件传输
pdcp -R ssh -g userhosts /home/opsuser/mysqldb.tar.gz /home/opsuser
pdcp -R ssh -w userhosts -r /home/opsuser/webdata /home/opsuser
多主机ssh封装mussh MUltihost SSH Wrapper
& 需要保证本地主机与管理服务器之间的单向信任
批量命令:
mussh -h opsuser@user01 opsuser@user02 -c uptime
文件批量命令 /home/opsuser/myhosts
mussh -H myhosts -l opsuser -c uptime
本地脚本远端执行
mussh -o "port=22" -H myhosts -s /usr/bin/python -C "/home/opsuser/checkos.py"
7.分布式监控
Ganglia HPC(高性能计算集群) 采集CPU 内存 硬盘使用率 I/O负载 网络流量等情况汇总到gmetad守护进程下,使用rrdtool存储数据.以曲线方式展示
& gmond: ganglia monitoring daemon 守护检测进程默认监听8649
& gmetad:ganglia meta daemon 数据汇聚守护进程,将数据存储至RRD引擎中
& webfrontend:从gmetad中读取RRD数据通过rrdtool生成图表
gmetric -n disk_used -v 40 -t int32 -u '% test' -d 50 -s '8.8.8.8:cloud1'
8.高性能Nginx服务器
HTTP/IMAP/POP3/SMTP代理服务器
--with-http_stub_status_module #开启nginx status功能 监控状态
--with-http_gzip_static_module #开启Gzip压缩功能
select 标准工作模式1
poll 标准工作模式2
kqueque 高效工作模式1
epoll 高效工作模式2
rtsig
/dev/poll
max_client=worker_processes * worker_connections(默认1024) #ulimit -n 65536
sendfile on; tcp_nopush on ; tco_nodelay on;
开启ngin运行状态
localtion /NginxStatus {
stub_status on;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file ../htpasswd;
}
htpasswd -C htpassswd password
信号处理:
QUIT: 15 处理完当前请求关闭进程
HUP: 重载配置,关闭原由进程开启新进程,不中断请求
USR1: Nginx日志切割
USR2: 平滑升级
WINCH: 从容关闭
rewrite重写 来自www.taob.com的请求至www.tb.com
service {
service_name www.taob.com;
rewirte ^/(.*)$
http://www.tb.com/$1 permanent; #301 redirect 302
}
基于核心变量$host实现重定向
service {
server_name
www.tb.com www.taob.com;
if ($host != 'www.tb.com') {
rewirte ^/(.*)$
http://www.tb.com/$1 permanent;
}
}
禁止访问特定资源
location ~* \.(txt|doc)$ {
root /data/www/wwwroot;
deny all;
}
Nginx内置变量
$args 与请求行的参数相等
$document_root 当前root命令指定的值
$uri 当前request中的URI
$document_uri 同等$uri
$host 与头部"Host"行的值一致
$limit_rate 限制连接速率
$request_method 同等于request的method GET或POST
$remote_addr 客户端IP
$remote_port 客户端端口
$remote_user 用户名 ngx_http_auth_basic_module认证
$request_filename 当前请求的文件的路径名,由root或alias与URI request组合而成
$request_uri 参数完整的初始URI
$query_string 与$args一致
$server_name 请求到达的服务器名
$server_port 请求到达的端口号
location ~ ^/best/ {
rewirte ^/best/(.*)$ /test/$1 break;
proxy_pass http://www.taob.com;
}
location / {
proxy_pass http://127.0.0.1:8080/;
set $query $query_string;
rewrite /dade /wordpress?$query?;
}
可将http://www.tb.com/wp/?p=160的页面重写到www.tb.com/wordpress/?p=160
service {
listen 80;
server_name
www.tb.cn www.taob.com;
if ($host != 'www.tb.cn') {
rewirte ^/(.*)$
http://www.tb.cn/error.txt bread;
rewirte ^/(.*)$
http://www.tb.cn/$1 permanent;
}
}
nginx 编译时注释 auto/cc/gcc 的 CFLAGS="$CFLAGS -g"
--with-cc-opt='-O3'
--with-cpu-opt=CPU [pentinm pentiumpro pentium3 pentium4 athlon opteron adm64 sparc32 sparc64 ppc64] cat /proc/cpuinfo |grep "model name"
TCMalloc 优化Nginx性能
1.安装libunwind库
2.安装google-perftools
3.重新编译nginx 添加参数 --with-google_perftools_module
4.添加google-perftools线程目录 0777 权限
5.nginx主配置文件pid处写入 google_perftools_profiles /tmp/tcmalloc;
6.重启nginx 验证
针对nginx的内核优化 /sbin/sysctl -p
net.ipv4.tcp_max_tw_buckets = 6000 #timewait数量 默认180000
net.ipv4.ip_local_port_range = 1024 65000 #允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1 #启用timewait快速回收
net.ipv4.tcp_tw_reuse = 1 #允许TIME-WAIT sockets
net.ipv4.tcp_syncookies = 1 #SYN等待队列溢出时启用cookies处理
net.core.somaxconn = 262144 #tcp并发连接 默认 128
net.core.netdev_max_backlog = 262144 #网口数据包速率比内核处理快时允许等到的队列大小
net.ipv4.tcp_max_orphans = 262144 #设定最大套接字不被关联到任何用户文件句柄上
net.ipv4.tcp_max_syn_backlog = 262144 #记录尚未收到客户端确认信息的连接请求最大值
net.ipv4.tcp_synack_retries = 1 #内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retres = 1 #内核放弃建立连接前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #保持FIN-WAIT-2状态的时间 默认60
net.ipv4.tcp_keepalive_time = 30 #keepalive启动时tcp发送的频度 默认2