centos linux安全和调优 第四十一节课
centos linux安全和调优 第四十一节课
上半节课
Linux安全
下半节课
Linux调优
2015-07-01linux安全和调优 [复制链接]
--http://www.apelearn.com/bbs/thread-8172-1-1.html
内容概要:
一. Linux安全
1. Linux发行版本
选择主流的,更新较快的。
从官网获取安装镜像
2. 硬件和物理安全
设置bios密码
设置grub密码
设置系统密码
选择有安全保障的idc机房
bios密码:不让他光盘启动,禁止他进入救援模式
grub密码:防止进入单用户模式修改密码
3. 系统和用户方面
关闭用不到的服务 用chkconfig 比如postfix和sendmail (http://www.aminglinux.com/study_v2/chapter16.html#id5)
尽量升级到最新稳定版程序包,例如(libevent-2.0.21-stable.tar.gz)
设置防火墙规则 (http://www.aminglinux.com/study_v2/chapter16.html#id3)
不需要登录的用户要禁止登录
usermod -s/sbin/nologin xx 不让登录
passwd -L 锁定帐户,不让登录
root远程登录限制 ( http://www.aminglinux.com/bbs/thread-5546-1-1.html and http://www.aminglinux.com/bbs/thread-5545-1-1.html)
root账户不能使用密码只能使用密钥远程登陆 [复制链接]
http://www.apelearn.com/bbs/thread-5545-1-1.html
打开sshd配置文件
vim /etc/ssh/sshd_config 在最后面增加一行 :
PermitRootLogin without-password
复制代码
保存配置文件后重启sshd服务
service sshd restart
打开系统日志记录一切信息
配置合适的sudoer
4. 文件系统安全 (参考 http://www.aminglinux.com/bbs/thread-6917-1-2.html)
使用ext3或者ext4
严格控制目录和文件的权限 umask
尽量少使用suid/sgid权限
重要的数据或配置文件要制定备份计划
5. pam (参考资料 http://www.infoq.com/cn/articles/linux-pam-one)
vsftpd的时候讲过pam
/etc/pam.conf
/etc/pam.d/
pam类型
auth 用户验证相关 要求用户输入一个口令
account 用户账户管理相关 检查一个用户的账户或者口令是否过期
session 与连接或者会话管理相关 比如将用户登录会话信息记录到日志
password 密码管理
pam 级别
required:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件。换句话说,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。 反正说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。
requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。与上面的required相比,似乎要显得更光明正大一些。
sufficient: 表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。
optional: 他表示即便该行所涉及的模块验证失败用户仍能通过认证。
6. 应用安全
各种常用服务 ftp、samba、nfs、rsync、mysql、http
web安全(漏洞:文件上传、xss、sql注入、CSRF、访问控制)
文件上传: 就像discuz论坛的图片上传,如果图片上传服务器时的目录可以执行php脚本,那么这就意味着,用户可以上传木马脚本,然后可以执行
xss:跨站脚本漏洞(Cross Site Scripting,常简写作XSS)是Web应用程序在将数据输出到网页的时候存在问题,导致攻击者可以将构造的恶意数据显示在页面的漏洞。因为跨站脚本攻击都是向网页内容中写入一段恶意的脚本或者HTML代码,故跨站脚本漏洞也被叫做HTML注入漏洞(HTML Injection)。
sql注入:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。PHP + MYSQL编程,引发SQL注入攻击的主要原因有两点:(1) PHP配置文件php.ini中的magic_quotes_gpc选项没有打开,被设置为off。(2) 开发者没有对数据类型进行检查和转义。第二点最为重要,如果没有第二点的保证,magic_quotes_gpc选项不论为on,还是off,都可能引发SQL注入攻击。
CSRF: (Cross-site request forgery,跨站请求伪造)伪造用户的请求利用受信任的网站来做一些用户不知道的事。当用户访问网站通过登录操作会得到身份标识的cookie,在不关闭浏览器并未注销登录的情况下会带着cookie,这种状态下就有可能会让攻击者去伪造请求。因为CSRF不容易被发现,所以用户通常不容易察觉但是其危害性是很明显的。
访问控制:
apache配置:
apache的order allow deny http://www.aminglinux.com/bbs/thread-832-1-1.html
apache限制某个目录下的php文件没有执行权限 http://www.aminglinux.com/bbs/thread-1000-1-1.html
apache 针对访问uri 限制ip http://www.aminglinux.com/bbs/thread-5365-1-1.html
几种限制ip的方法 http://www.aminglinux.com/bbs/thread-6519-1-1.html
nginx配置
限制只让某个ip访问 http://www.aminglinux.com/bbs/thread-450-1-1.html
禁止通过ip访问站点 http://www.aminglinux.com/bbs/thread-38-1-1.html
禁止某个IP或者IP段访问站点的设置方法 http://www.aminglinux.com/bbs/thread-546-1-1.html
使用 user_agent 控制客户端访问 http://www.aminglinux.com/bbs/thread-846-1-1.html
7. 入侵检测
snort (https://www.snort.org/)
snort中文手册: http://www.360doc.com/content/08/0114/14/25127_972488.shtml
下半节课
二. Linux调优
参考资料:
http://os.51cto.com/art/201303/385726.htm(调优那些事)
http://www.111cn.net/sys/linux/58433.htm(io/系统/内存性能调优)
http://hong.im/2013/04/20/linux-tcp-tuning/ (高流量大并发Linux TCP 性能调优)
http://wenku.baidu.com/view/0985c9dba58da0116c1749ae.html (文库--LINUX性能调优方法总结)
http://my.oschina.net/sharelinux/blog?catalog=289503 (浅谈linux性能调优系列)
http://colobu.com/2014/09/18/linux-tcpip-tuning/ (TCP/IP协议栈)
https://blog.linuxeye.com/379.html(mysql调优)
http://www.tuicool.com/articles/RbUNn2 (nignx+php-fpm 高并发参数配置及linux内核参数优化)
http://blog.csdn.net/wangsg2014/article/details/38804873 (nignx参数优化)
http://os.51cto.com/art/201003/192112.htm (apache参数优化)
http://www.phpboy.net/apache/488.html(apache参数优化)
http://www.360doc.com/relevant/178008993_more.shtml (apache参数优化文档库)
http://www.cnblogs.com/R-zqiang/archive/2012/06/12/2545768.html (php.ini参数优化)
http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024731.html (tomcat调优)
http://www.php-oa.com/2008/02/03/squidyouhua.html (squid调优)
http://www.neters.cn/archives/548.html(squid优化指南)
http://handao.blog.techweb.com.cn/archives/134.html (squid优化相关的内核参数调整)
【硬件方面】
1. cpu
2. 内存 (增加内存)
3. 存储 (使用raid,使用ssd)
4. 网卡 (使用千兆网卡,或者双网卡绑定)
【系统方面 】
1. 内核参数优化(网络相关、内存相关、缓冲缓存相关)
2. 文件系统方面(分区调优,格式化时根据存储文件特性,指定合适的块大小,noatime,日志隔离,软raid,有效使用/dev/shm,关闭不必要的服务)
cd /dev/shm/
[root@steven shm]# ll
drwxr-xr-x 2 root root 40 2月 1 08:16 nginx_temp
ls -ld /dev/shm/
drwxrwxrwt 3 root root 60 2月 1 08:16 /dev/shm/
3. cpu优化 (进程绑定,中断绑定)
numa架构cpu: http://blog.csdn.net/jollyjumper/article/details/17168175
taskset 把进程和cpu绑定 http://blog.csdn.net/ttyttytty12/article/details/11726569
【应用程序方面】
1. nginx、apache、php-fpm、mysql、tomcat、squid等应用,是可以通过调节各个参数获得性能优化的。
2. web优化,比如可以把用户请求合并(js、css合并),使用cdn加速静态页访问速度,把图片文档压缩减少带宽传输,
3. 优化网站程序
php-fpm的 slowlog
mysql的 slowlog
【架构方面】
1. 使用简单并且稳定的架构方案
lvs:四层负载均衡
nginx:七层负载均衡
2. 多使用缓存(squid,varnish,memcache,nosql相关:redis,mongodb)
php.ini
;php_value[session.save_handler]=redis
;php_value[session.save_path]="tcp://127.0.0.1:6379?weiht=1"
将session存入redis或者memcached
扩展阅读
http://www.apelearn.com/bbs/thread-6917-1-2.html
安全运维:文件系统安全
一、锁定系统重要文件
系统运维人员有时候可能会遇到通过root用户都不能修改或者删除某个文件的情况,产生这种情况的大部分原因可能是这个文件被锁定了。在Linux下锁定文件的命令是chattr,通过这个命令可以修改ext2、ext3、ext4文件系统下文件属性,但是这个命令必须有超级用户root来执行。和这个命令对应的命令是lsattr,这个命令用来查询文件属性。
通过chattr命令修改文件或者目录的文件属性能够提高系统的安全性,下面简单介绍下chattr和lsattr两个命令的用法。
chattr命令的语法格式如下:
chattr [-RV] [-v version] [mode] 文件或目录
主要参数含义如下:
-R:递归修改所有的文件及子目录。
-V:详细显示修改内容,并打印输出。
其中mode部分用来控制文件的属性,常用参数如下表所示:
参数 含义
+ 在原有参数设定基础上,追加参数
- 在原有参数设定基础上,移除参数
= 更新为指定参数
a 即append,设定该参数后,只能向文件中添加数据,而不能删除。常用于服务器日志文件安全,只有root用户才能设置这个属性
c 即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作
i 即immutable,设定文件不能被修改、删除、重命名、设定链接等,同时不能写入或新增内容。这个参数对于文件系统的安全设置有很大帮助
s 安全的删除文件或目录,即文件被删除后硬盘空间被全部收回
u 与s参数相反,当设定为u时,系统会保留其数据块以便以后能够恢复删除这个文件。这些参数中,最常用到的是a和i,a参数常用于服务器日志文件安全设定,而i参数更为严格,不允许对文件进行任何操作,即使是root用户
lsattr用来查询文件属性,用法比较简单,其语法格式如下:
lsattr [-adlRvV] 文件或目录
常用参数如下表所示。
参数 含义
-a 列出目录中的所有文件,包括以.开头的文件
-d 显示指定目录的属性
-R 以递归的方式列出目录下所有文件及子目录以及属性值
-v 显示文件或目录版本
在Linux系统中,如果一个用户以root的权限登录或者某个进程以root的权限运行,那么它的使用权限就不再有任何的限制了。因此,攻击者通过远程或者本地攻击手段获得了系统的root权限将是一个灾难。在这种情况下,文件系统将是保护系统安全的最后一道防线,合理的属性设置可以最大限度地减小攻击者对系统的破坏程度,通过chattr命令锁定系统一些重要的文件或目录,是保护文件系统安全最直接、最有效的手段。
对一些重要的目录和文件可以加上“i”属性,常见的文件和目录有:
chattr -R +i /bin /boot /lib /sbin
chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/hosts
chattr +i /etc/resolv.conf
chattr +i /etc/fstab
chattr +i /etc/sudoers
对一些重要的日志文件可以加上“a”属性,常见的有:
chattr +a /var/log/messages
chattr +a /var/log/wtmp
对重要的文件进行加锁,虽然能够提高服务器的安全性,但是也会带来一些不便,例如,在软件的安装、升级时可能需要去掉有关目录和文件的immutable属性和append-only属性,同时,对日志文件设置了append-only属性,可能会使日志轮换(logrotate)无法进行。因此,在使用chattr命令前,需要结合服务器的应用环境来权衡是否需要设置immutable属性和append-only属性。
另外,虽然通过chattr命令修改文件属性能够提高文件系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var等目录。
根目录不能有不可修改属性,因为如果根目录具有不可修改属性,那么系统根本无法工作:/dev在启动时,syslog需要删除并重新建立/dev/log套接字设备,如果设置了不可修改属性,那么可能出问题;/tmp目录会有很多应用程序和系统程序需要在这个目录下建立临时文件,也不能设置不可修改属性;/var是系统和程序的日志目录,如果设置为不可修改属性,那么系统写日志将无法进行,所以也不能通过chattr命令保护。
虽然通过chattr命令无法保护/dev、/tmp等目录的安全性,但是有另外的方法可以实现,在面将做详细介绍。
二、文件权限检查和修改
不正确的权限设置直接威胁着系统的安全,因此运维人员应该能及时发现这些不正确的权限设置,并立刻修正,防患于未然。下面列举几种查找系统不安全权限的方法。
(1)查找系统中任何用户都有写权限的文件或目录
查找文件:find / -type f -perm -2 -o -perm -20 |xargs ls -al
查找目录:find / -type d -perm -2 -o -perm -20 |xargs ls –ld
(2)查找系统中所有含“s”位的程序
find / -type f -perm -4000 -o -perm -2000 -print | xargs ls –al
含有“s”位权限的程序对系统安全威胁很大,通过查找系统中所有具有“s”位权限的程序,可以把某些不必要的“s”位程序去掉,这样可以防止用户滥用权限或提升权限的可能性。
(3)检查系统中所有suid及sgid文件
find / -user root -perm -2000 -print -exec md5sum {} \;
find / -user root -perm -4000 -print -exec md5sum {} \;
将检查的结果保存到文件中,可在以后的系统检查中作为参考。
(4)检查系统中没有属主的文件
find / -nouser -o –nogroup
没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此找到这些文件后,要么删除掉,要么修改文件的属主,使其处于安全状态。
三、/tmp、/var/tmp、/dev/shm安全设定( /dev/shm/跟/tmp的权限一样1777)
在Linux系统中,主要有两个目录或分区用来存放临时文件,分别是/tmp和/var/tmp。存储临时文件的目录或分区有个共同点就是所有用户可读写、可执行,这就为系统留下了安全隐患。攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装,严重影响服务器的安全,此时,如果修改临时目录的读写执行权限,还有可能影响系统上应用程序的正常运行,因此,如果要兼顾两者,就需要对这两个目录或分区就行特殊的设置。
/dev/shm是Linux下的一个共享内存设备,在Linux启动的时候系统默认会加载/dev/shm,被加载的/dev/shm使用的是tmpfs文件系统,而tmpfs是一个内存文件系统,存储到tmpfs文件系统的数据会完全驻留在RAM中,这样通过/dev/shm就可以直接操控系统内存,这将非常危险,因此如何保证/dev/shm安全也至关重要。
对于/tmp的安全设置,需要看/tmp是一个独立磁盘分区,还是一个根分区下的文件夹,如果/tmp是一个独立的磁盘分区,那么设置非常简单,修改/etc/fstab文件中/tmp分区对应的挂载属性,加上nosuid、noexec、nodev三个选项即可,修改后的/tmp分区挂载属性类似如下:
LABEL=/tmp /tmp ext3 rw,nosuid,noexec,nodev 0 0
其中,nosuid、noexec、nodev选项,表示不允许任何suid程序,并且在这个分区不能执行任何脚本等程序,并且不存在设备文件。
在挂载属性设置完成后,重新挂载/tmp分区,保证设置生效。
对于/var/tmp,如果是独立分区,安装/tmp的设置方法是修改/etc/fstab文件即可;如果是/var分区下的一个目录,那么可以将/var/tmp目录下所有数据移动到/tmp分区下,然后在/var下做一个指向/tmp的软连接即可。也就是执行如下操作:
[root@server ~]# mv /var/tmp/* /tmp
[root@server ~]# ln -s /tmp /var/tmp
如果/tmp是根目录下的一个目录,那么设置稍微复杂,可以通过创建一个loopback文件系统来利用Linux内核的loopback特性将文件系统挂载到/tmp下,然后在挂载时指定限制加载选项即可。一个简单的操作示例如下:
[root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
[root@server ~]# mke2fs -j /dev/tmpfs
[root@server ~]# cp -av /tmp /tmp.old
[root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
[root@server ~]# chmod 1777 /tmp
[root@server ~]# mv -f /tmp.old/* /tmp/
[root@server ~]# rm -rf /tmp.old
最后,编辑/etc/fstab,添加如下内容,以便系统在启动时自动加载loopback文件系统:
/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0
为了验证一下挂载时指定限制加载选项是否生效,可以在/tmp分区创建一个shell文件,操作如下:
[root@tc193 tmp]# ls -al|grep shell
-rwxr-xr-x 1 root root 22 Oct 6 14:58 shell-test.sh
[root@server ~]# pwd
/tmp
[root@tc193 tmp]# ./shell-test.sh
-bash: ./shell-test.sh: Permission denied
可以看出,虽然文件有可执行属性,但是已经在/tmp分区无法执行任何文件了。
最后,再来修改一下/dev/shm的安全设置。由于/dev/shm是一个共享内存设备,因此也可以通过修改/etc/fstab文件设置而实现,在默认情况下,/dev/shm通过defaults选项来加载,对保证其安全性是不够的,修改/dev/shm的挂载属性,操作如下:
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
通过这种方式,就限制了任何suid程序,同时也限制了/dev/shm的可执行权限,系统安全性得到进一步提升。
#cd /dev/shm/
# ll
drwxr-xr-x 2 root root 40 2月 1 08:16 nginx_temp
#ls -ld /dev/shm/
drwxrwxrwt 3 root root 60 2月 1 08:16 /dev/shm/
find / -uid 0 -perm -2000 -print -exec md5sum {} \;
find / -uid 0 -perm -4000 -print -exec md5sum {} \;
-uid 0更好,可能系统有多个uid为0 同样有root权限的用户