Linux 安全注意点

LINUX 安全加固

root远程登录加固

/etc/securetty 文件

“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。

登录程序(通常是“/bin/login”)需要读取“/etc/securetty”文件。

它的格式是:列出来的tty设备都是允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。

注释掉(在这一行的开头加上#号)所有你想不让root登录的tty设备。

  

tty就是tty,是一个很宽泛的名词,它是Teletype的缩写

如果你指的是/dev/tty,那指当前终端

pts是pesudo tty slave,是伪终端的slave端

console好像是指当前的控制台(或者监视器),比如说你Ctrl+Alt+x,然后echo “123” > /dev/console,123总会显示在你的monitor上。

vc是virtual console,也可以理解为虚拟的监视器,当你Ctrl+Alt+x,就会切换到vc x,在/dev下面没有直接对应的设备文件,不过你如果尝试 echo “123” > /dev/vcs1, 你在monitor上也能看到,不过要切换到对应的vc。

vt指的是virtual terminal,虚拟终端,在我看来指的就是虚拟控制台

禁掉 telnet的root登录:

把/etc/securetty文件中的pts0 - pts3全部注释掉就可以了。

1
2
3
4
tty 控制终端 包括(1)tty从虚拟控制台登录(2)pts在X下开的shell窗口则显示为pts
1.tty有rs232、rs422、vcon三种设备,平常主要使用rs232借口的串行端口做心跳或者链接串行设备。
2.pst每一个远程连接都会产生一个pst设备。
3.console当系统安装时,可以直接选择串口终端或者连接显卡。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@server ~]# cat /etc/securetty 
console
vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
1
2
3
4
5
[root@server ~]# w
09:43:56 up 13 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 09:30 13.00s 0.02s 0.02s -bash
root pts/0 172.16.1.2 09:31 0.00s 0.01s 0.00s w

我们可以看到 我们远程竟然是 pts。但是 securetty 并没有pts 呀 他是如何登陆上来的?

sshd 使用的pam模块里, 并没有 pam_securetty.so, 所以, root是不是可以ssh是受sshd_config里的 permit_root_login控制, 与 securetty无关. 但 login 和 remote 使用的 pam 模块里有 pam_securetty.so, 所以, telnet的时候, 需要验证你的终端.

如果你只想让root 通过console 登陆的话 那么可以把其他全部注释掉 只留 console

/etc/securetty

该文件可控制根用户登录的设备,该文件里记录的是可以作为根用户登录的设备名,如tty1、tty2等。用户是不能从不存在于该文件里的设备登录为根用户的。这种情况用户只能以普通用户登录进来,再用su命令转为根用户。/etc/securetty文件的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/etc/securetty: list of terminals on which root is allowed to login.
See securetty(5) and login(1).
console

# for people with serial port consoles
ttyS0

# for devfs
tts/0

# Standard consoles
tty1
tty2
tty3
...

如果/etc/securetty是一个空文件,则根用户就不能从任务的设备登录系统。只能以普通用户登录,再用su命令转成根用户。如果/etc/securetty文件不存在,那么根用户可以从任何地方登录。这样会引发安全问题,所以/etc/securetty文件在系统中是一定要存在的。

rhosts

使用.rhosts文件时的安全风险
不幸的是,该.rhosts文件存在一个主要的安全问题。虽然该/etc/hosts.equiv文件受系统管理员控制,并且可以进行有效管理,但任何用户都可以创建一个.rhosts文件,授予用户在没有系统管理员了解的情况下选择的访问权限。

在所有用户的主目录位于单个服务器上并且只有某些人在该服务器上拥有超级用户访问权限的情况下,阻止用户使用.rhosts文件的好方法是在其家中创建一个空文件作为超级用户目录。然后,您会将此文件中的权限更改为000,以便即使以超级用户身份更改也很难。这将有效地防止用户通过.rhosts不负责任地使用文件来冒着系统安全风险。但是,如果用户能够将有效路径更改为其主目录,则不会解决任何问题。

管理.rhosts文件的唯一安全方式是完全禁止它们。有关详细说明,请参阅“如何搜索和删除.rhosts文件”。作为系统管理员,您可以经常检查系统是否违反此政策。此策略的一个可能例外是root帐户 - 您可能需要有一个.rhosts文件才能执行网络备份和其他远程服务。

1
2
cat /root/.rhosts
+ +

为+ + 说明允许所有的用户rlogin

您能用.rhosts文件控制使用TCP/IP命令对您帐号的访问。用户能用标准的编辑器象Vi来创建他们帐号中的.rhosts文件。它必须位于用户的主目录。使用.rhosts文件是一种允许用户不提供口令而访问您的系统的简单方法。如果需要禁止此用户访问,只须简单地从文件.rhost中删除系统名和用户注册名。如果一个用户的注册名和系统名在文件.rhost中,那么此用户即可不提供口令直接访问系统。并不是所有的远程注册操作都需要这种访问形式(您能用输入口令的方式来替代);但一些远程命令要求有.rhosts文件,象远程复制文件或远程执行Linux命令。如果您想在远程系统的帐号中招待这些命令,此帐号的.rhosts文件中必须有您的注册名和系统名。

通过.rhosts对某一系统进行访问时,也允许您使用TCP/IP命令直接访问系统中您的其他帐号。您不需要先注册到这些帐号中。可以把系统中您的其他帐号做为当前注册帐号的扩展。不管文件在哪个账号下,都可以用frcp命令从一个目录复制到另一个目录。用命令rsh,可以在您的其他帐号中招待任何Linux命令。

删除该文件即可,执行命令

rm .rhosts

查找suid危险文件

1
2
3
4
5
[root@server tmp]# cat suidtest.sh 
#!/bin/bash
for PART in {/bin,/sbin,/usr/sbin,/usr/bin};do
find $PART/* \( -perm -04000 \) -type f -print
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@server tmp]# ./suidtest.sh 
/bin/mount
/bin/ping
/bin/ping6
/bin/su
/bin/umount
/sbin/pam_timestamp_check
/sbin/unix_chkpwd
/usr/sbin/suexec
/usr/sbin/useradd
/usr/sbin/usernetctl
/usr/bin/chage
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/sudoedit

显然useradd不应该有suid 权限,不合规

加固方法 执行如下命令

chmod 755 /usr/sbin/useradd

即可

查找sgid危险文件

1
2
3
4
#!/bin/bash
for PART in {/bin,/sbin,/usr/sbin,/usr/bin};do
find $PART/* \( -perm -02000 \) -type f -print
done

加固方案相同

chmod 755 \

查找所有人写权限文件

1
2
3
4
5
6
root@32bc9271c2be:/pentest# cat dangwrite.sh 
#!/bin/bash
for PART in `awk '($3 == "ext4" || $3 == "ext3") \
{ print $2 } ' /etc/fstab`;do
find $PART -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
done

安全日志分离

1
2
3
4
vim /etc/rsyslog.conf
#将authpriv .* 这一行 注释去掉
#重启服务
service rsyslog restart

关闭sendmail

chkconfig –list sendmail

chkconfig sendmail off

关闭ping 响应

cat /proc/sys/net/ipv4/icmp_echo_ignore_all

加固过程

1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Linux FTP 加固

FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写,即文件传输协议。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下FTP协议使用20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。

  1. 配置linux 的防火墙,使得ftp能够对外提供服务,要求配置规则中只包含端口

查看当前防火墙filter表策略规则。

命令:iptables -L

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@xserver ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

添加规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@xserver ~]# iptables -I INPUT 2 -p tcp --dport  21 -j ACCEPT
[root@xserver ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@xserver ~]#

ftp banner

1
2
3
4
root@32bc9271c2be:/pentest# ftp 172.16.1.8
Connected to 172.16.1.8.
220 (vsFTPd 2.3.4)
Name (172.16.1.8:root):

对于banner 的隐藏也是尤为重要的

chroot_list

chroot_list文件里面的用户可以做目录浏览

将用户从chroot_list文件中去掉,然后重启vsftpd服务。

ls -R

命令:ls -R

注:vsftpd配置项“ls_recurse_enable=”如果设置成yes,那么此设置将允许用户使用 “ls -R”. 这有点安全威胁, 因为在大型站点的根目录下进行 ls -R 将会消耗很多资源。

登陆日志

进入/var/log 目录,查看vsftpd.log文件

同时连接只能3个

设定规则只允许同时只有3个连接能够访问ftp服务

第一步、在filter表INPUT链中插入策略

命令:iptables -I INPUT 2 -p tcp –syn –dport 21 -m connlimit –connlimit-above 3 -j DROP

第二步、查看已经添加的策略

命令:iptables -L INPUT -n

禁止匿名账户登陆

1)禁止使用匿名用户登录ftp服务,使用命令#vi /etc/vsftpd/vsftpd.conf打开vsftpd.conf文件,找到“anonymous_enable”选项,将其值改为“NO”:
anonymous_enable=NO。

禁止普通用户做目录遍历

在/etc/vsftpd/vsftpd.conf文件中找到以下三行内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#chroot_list_enable=YES

#(default follows)

#chroot_list_file=/etc/vsftpd/chroot_list

将一、三行前的“#”符号去除。
新增一个文件/etc/vsftpd/chroot_list,文件内容是用户名称:ftpuser

执行命令如下:

#touch /etc/vsftpd/chroot_list

#echo ftpuser >/etc/vsftpd/chroot_list

禁止“ls -R”命令

使用命令#vi /etc/vsftpd/vsftpd.conf打开vsftpd.conf文件,找到“ls_rescure_enable=YES”选项,将这行用“#”注释掉

设置ftp连接session时长

使用命令

#vi /etc/vsftpd/vsftpd.conf打开vsftpd.conf文件,找到“idle_session_timeout”选项,设置“idle_session_timeout=20”,设置用户会话的空闲中断时间,连接服务器的用户在20秒时间内没有任何动作将被断开,默认为600秒。