首页 > 代码库 > 全面inux主机安全配置详解--系统OS安全(第二部分)

全面inux主机安全配置详解--系统OS安全(第二部分)

系统安全

        

最小服务法

文件安全(suid/sgid/stick/chattr)

升级系统和软件

        最小权限法(su/sudo)

        SSH安全建议


最小服务法(system v/xinetd)

关闭不需要的服务:

# vim /root/service.sh

#!/bin/bash


service xinetd stop 

chkconfig xinetd off


services="network sshd syslog lvm2-monitor messagebus sendmail crond gpm anacron auditd haldaemon irqbalance avahi-daemon"


offservices=`chkconfig --list |grep 0: | awk ‘{print $1}‘`


for i in $offservices

do

        chkconfig $i off

done


for i in $services

do

        chkconfig $i on

done


reboot


禁止普通用户执行init.d目录中的脚本

# chmod -R o=- /etc/rc.d/init.d



文件安全(suid/sgid/stick/chattr) 分区安全


需要独立划分分区的目录(分区的原则:所有用户都能写的,建议分区;读或写频繁地,建议分区):

/

/boot

swap

/usr或/opt

/home

/var and /var/tmp

/tmp

/data

/bak


挂载选项:

1. noexec   --所有的二进制命令在此分区都无法运行,脚本也无法运行,可以考虑用来存放数据。

2. nodev    --所有的字符文件和设备文件都无法在此分区中使用(如: zero, sda etc).

3. nosuid   --不允许在此分区使用拥有冒险位和强制位的文件

4. noatime --不允许更新文件的访问时间,减少额外的IO开销

5. nodiratime --不允许更新目录访问时间



Create separate partitions for Apache and FTP server roots. Edit /etc/fstab file and make sure you add the following configuration options:

Sample /etc/fstab entry to to limit user access on /dev/sda5 (ftp server root directory):

# vim /etc/fstab

/dev/sda5  /ftpdata          ext3    defaults,nodev,noexec 1 2




使用磁盘配额(所有用户用写目录都需要做配额限制):

1.Enable quotas per file system by modifying the /etc/fstab(usrquota) file.

2.Remount the file system(s). mount -o remount /xx

3.Create the quota database files and generate the disk usage table.

quotacheck -cmu /xx ; quotaon -vu /xx

4.Assign quota policies.

edquota -u user01

edquota -p user01 user02

setquota -u user01 1000 2000  10 20

查询:

quota -u user01

repquota -vu /xx



锁定重要文件的i(inode)节点

chattr命令、lsattr命令


# chattr +i /etc/passwd--完全锁定inode

# useradd newuser

useradd:无法打开密码文件


# lsattr /etc/passwd

----i-------- /etc/passwd


# chattr +-a /file--只锁定旧inode与block的对应关系,允许追加新的block


需要加锁的文件:

/boot/grub/grub.conf

/etc/passwd

/etc/shadow

/etc/sudoers





suid/sgid(分区挂选项:nosuid)

1.手工找出系统中拥有suid/sgid的文件(快照)

# find / -type f -perm +6000 -exec ls -lh {} \;

# find / -type f -perm +6000 -ls



2.使用脚本的方法查找对比:

# find / -type f -perm +6000 > /etc/sfilelist

# vim check_perm.sh

#!/bin/bash

OLD_LIST=/etc/sfilelist

for i in `find / -type f -a -perm +6000`

do

    grep -F "$i" $OLD_LIST &> /dev/null

    [ $? -ne 0 ] && ls -lh $i

done



升级系统和软件

# yum list installed

# yum list packageName

# yum remove packageName



Update softwares:

# yum update --升级整个系统

# yum update packageName--升级单独的一个软件包或多个


最小权限法(su/sudo)

su--完全提权,需要知道提权目标用户密码

su--不指定用户时,切换成为超级用户,但环境变量沿用的是上一个用户的变量 

su ---不指定用户时,切换成为超级用户,环境变量沿用的是当前用户的变量

su username--切换成为指定的用户

su - username

su -l username


只限定某个用户或者某组拥有切换成root的权限,剩下的用户都无su提权的权限:

# vim /etc/pam.d/su

……

auth            required        pam_wheel.so use_uid--只有wheel组的成员才能使用su

……


# gpasswd -a zhangsan wheel

# usermod -G wheel zhangsan


使用ssh远程管理linux时,避免直接使用管理员登录,而是先使用普通用户普通至系统,然后再通过su/sudo方式来提权。

好处:避免root被暴力破解





sudo--权限最小化,只分配指定权限而且不需要知道目标用户(root)的密码,最有效的权限分割


以下2种方法都可以编辑/etc/sudoers文件

# visudo--使用专业工具修改配置文件,可以检查语法错误,不需要强制就能保存

# vim  /etc/sudoers--直接编辑配置文件,这种不能检查配置文件的语法问题,而且需要强制保存


配置文件的格式:

root    ALL=(ALL)       ALL

授予用户登录linux客户的源地址用户身份命令

组:%


常用命令选项:

sudo -l查看允许执行的命令列表

sudo -k清除用户密码验证的时间戳

sudo -v重新校验密码

sudo ls通过sudo执行命令(sudo 命令行)

sudo通配符:

       *       Matches any set of zero or more characters.


       ?       Matches any single character.


       [...]   Matches any character in the specified range.

[0-9]

[abc]

[a-Z]

[0-9]

[1-2][0-9]10-29


       [!...]  Matches any character not in the specified range.


vsftpd实例授权:

1、能够使用管理员安装和卸载vsftpd

2、能够重启vsftpd服务

3、能够修改vsftpd的配置文件

4、能够修改vsftpd匿名用户的文件权限

# visudo

u01 ALL=/usr/bin/yum * vsftpd, /sbin/service vsftpd *, /usr/bin/vim /etc/vsftpd/* ,/bin/ch[mo]* * /var/ftp/*

用户管理的权限:

1、能新建和删除用户,但不能新建管理员

2、能够设置密码,过期时间,但不能设置管理员密码

3、能将用户加入某个组,或者从组里边清出去

# visudo

 u01 ALL=/usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/bin/chage, /usr/bin/passwd, !/usr/sbin/useradd *-o*, !/usr/sbin/userdel *root*, !/usr/sbin/usermod *-o*, !/usr/bin/chage *root*, !/usr/bin/passwd *root*



httpd的授权:

# visudo

u01     ALL=(root) /usr/bin/vim /etc/httpd/conf*/*.conf, /bin/chown * /var/www/html/*, /bin/chmod * /var/www/html/*, /sbin/service httpd *, /usr/bin/yum -y install httpd*


结合wheel组来授权(以组为单位):

%wheel      ALL=(ALL)       ALL

%wheel        ALL=(ALL)       NOPASSWD: ALL



结合别名来授权:

实例1:

# visudo

User_Alias  OPERATORS=jerry,tom,tsengyia

Host_Alias  MAILSERVERS=mail,smtp,pop--保证这三个主机名能够被解析

Cmnd_Alias  SOFTWARE=/bin/rpm,/usr/bin/yum


OPERATORS   MAILSERVERS=SOFTWARE--引用变量来配置sudo权限


实例2:

设立组帐号“managers”,授权组内的各成员用户可以添加、删除、更改用户帐号

# groupadd managers

# gpasswd -M zhangsan,lisi managers


# visudo

Cmnd_Alias USERADM = /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod,!/usr/sbin/useradd *-o*, !/usr/sbin/userdel *root*, !/usr/sbin/usermod *-o*


%managers ALL=USERADM


允许用户管理apache

user01ALL=/usr/bin/vim /etc/httpd/*, /sbin/service httpd *


使用别名的方式给u01,u02用户授予httpd管理权限:

User_Alias HTTP_ADMIN = u01,u02

Cmnd_Alias HTTP_COMM = /usr/bin/vim /etc/httpd/conf*/*.conf, /bin/chown * /var/www/html/*, /bin/chmod * /var/www/html/*, /sbin/service httpd *, /usr/bin/yum -y install httpd*


HTTP_ADMIN      ALL= NOPASSWD: HTTP_COMM


SSH安全建议:


1、只使用ssh v2

Protocol 2

ListenAddress x.x.x.x--如果你的环境中有VPN通道,建议sshd监听在内网的地址


2、限制用户访问(用户与用户之间使用空格隔开,可以使用? *通配符)

AllowUsersuser01 root--只允许哪些用户使用ssh登录

DenyUsersuser02 user03--只拒绝哪些用户访问,两种方法选其一

DenyGroups

AllowGroups


3、配置空闲超时自动断开

使用shell变量来完成直接且简单:TMOUT


4、禁止管理员直接使用ssh登录:

PermitRootLogin no--使用普通用户登录用,调用su/sudo来提权


5、更改默认的监听端口和监听IP

Port 5589

ListenAddress 0.0.0.0--按照需求可设置监听在服务器私有地址上,如果监听在公网的上地址上则需要更改端口,不能直接使用22端口


6、给账号设置强壮的密码

# rpm -ivh expect-5.43.0-5.1.i386.rpm 

# mkpasswd -l 128 -d 8 -C 15 -s 10

omlrjcU3fxivSqtotyu‘nk6tR(zhp1Jcel_gxjnqedErpx_1g4U]amtqst3igWXb-f2eqqqJohfjuzccdC.coMok7Abvtjfzej&vfvfTblgBmWmijqh.w&acegjrqwqq

-l密码长度

-d多少个数字

-C 大写字母个数

-s特殊符号的个数

f

7、使用密钥对验证:

# ssh-keygen -t rsa

# ssh-copy-id /$HOME/.ssh/id.rsa.pub username@remotehost


8、使用iptables控制(防止ssh密码被暴力破解):

在每分钟内只允许有三个新的连接去连接ssh服务器,并发连接是3 个,如果超过此值 将被拒绝

# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -j DROP

# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT


9、减少密码错误尝试次数:

MaxAuthTries 3--设置密码错误尝试次数



tcpwrappers+bash scrpts(错误尝试源地址重复次达到一定上限):

last--查询所有用户在线情况(/var/log/wtmp)

lastlog--查询最后一次登录时间

lastb--查询失败登录的记录



使用脚本实现对sshd暴力破解的IP进行拦截,把连续3次以上通过ssh登录系统失败的IP放到/etc/hosts.deny 。 文件中的IP不能重复。


脚本要求每10分钟执行一次。


lastb is the same as last, except that by default it shows a log of the file /var/log/btmp, which contains all  the  bad  login attempts


# lastb -i -a | grep ssh  | awk ‘{print $NF}‘ | uniq  -c | awk ‘$1>3{print $2}‘


本文出自 “运维!解放!” 博客,谢绝转载!