1. 禁止root帐号ssh,使用自定义帐号ssh;
这样一来,黑客要先猜到帐号,然后才能猜解密码;
2. 禁止帐号登录,使用pubkey登录;
3. 作ip ACL,只允许几个特定的IP访问;
4. ssh端口迁移,将默认22端口改为其他端口;
5. 启动尽量少的服务;如无必要,不起服务。
配置开始
一、关闭 SSH 密码登陆
首先,你需要有自己的 SSH Key,如果你使用 Windows 系统,可以用 Putty 下的 PUTTYGEN.EXE 生成私匙和公匙。
第一步,运行 PUTTYGEN.EXE
一般,我们选择默认的 RSA 加密即可,默认的 1024 位加密足够用,如果要保险点,可以选择 2048 或 4096 位加密,如图红圈处:
第二步,点击 Generate ,然后鼠标随意在空白处移动
等进度条满了,就生成好你的 SSH Key 了:
如果要更安全一点,可以设置 Key Passphrase ,也就是密码,这个密码和 root 密码不同,一旦别人获取了你的 Key ,没有这个密码他也加载不了你的 Key。
第三步,点击 Save Public Key 保存你的公匙,整个文件如下
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "showfom-rsa-key-20130701"
AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdw
HEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzU
XDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3
681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2h
ciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUj
Lj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ==
---- END SSH2 PUBLIC KEY ----
其中中间那么长长的一串,就是你的公匙了,可以放在服务器的 ~/.ssh/authorized_keys ,我们应采取以下的格式:ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
其中 ssh-rsa 为加密类型, showfom-rsa-key-20130701 为说明,可以是任意文本,如 showfom-notebook
第四步,点击 Save Private Key 生成用于 Putty 的私匙,这里我们保存为 showfom.ppk ,整个文件如下
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: Showfom
Public-Lines: 4
AAAAB3NzaC1yc2EAAAABJQAAAIBTILl54rOaEEkv95VKR6IEZ9Y0d1IpNNQeyk+e
yHPtc7jVTmfL0oiho9s2UqquaNGmLmzLjhXRj3cPZ1VZInPFqVtgWYKWPEpGckGI
7/iTpNUuz6tKguEi5RYaEtfgKWF13qC5S8dWlk2FGv7dY5GbSoZMHZtc+zTL9Jpn
NCa5nw==
Private-Lines: 8
AAAAgEWly9TSsiciZtUpYWe/eegD+Kh/pbPSUNuG6MNOAEN8ocd5Ctsz2kI9LUkw
gSpX0j8f+kmuZU62eIKHAlGZZ+nVyklcHE7qFO2AyMCuniUYm0mgdN5gjXUBFduV
VTjIaYwd282Yo0xtjPWN0DJF3jmmsrw6pwMwaa6r6pAlKANtAAAAQQClYrYCu3eu
0GcGw9G2MVLIZoHoKYPL2e6HjfPQhvsze6AKUzpTF/DGMkBFY6dH//0zSoHue2jn
gNsaLQygBvT/AAAAQQCArGNL76eXHtR28TRY2PONg8ij3YN9mCzYG3sDsV8feGAk
RyZ8T5b6xZuf9UyvZ1lIA10i7ULZ63s2hvCZUxthAAAAQD+auXN8fUAylROh8zTM
14FyY7GRwdN7y7+EtZ8NuVDLvZP9Svpd4V5Ti9LpqjtiUcp0eELCd5i7zxyV2oHe
U78=
Private-MAC: ce0968aff198e2c2550704625b23ba7575e6b260
这个 showfom.ppk 你需要通过 Putty 目录下的 PAGEANT.EXE 导入,这样你就可以不需要输入 root 密码即可登录你的 VPS。
PS: WinSCP 和 Putty 的 SSH Key 是通用的,只需要导入一次即可。
但是 Putty 的 Private Key 是不标准的,只能用于 Putty 或 WinSCP ,如果你使用 Xshell 4 ,则需要转换成 rsa 文件,可以在 PUTTYGEN.EXE 上方菜单里的 Conversions > Export OpenSSH Key 方式转换。
第五步,导入你的 Linux VPS 或服务器
如果你本地是 Linux 桌面环境,可以很简单的一条命令搞定:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@198.51.100.100
但是大多数用户还是 Windows 用户,所以我建议两种比较简单的方法
1、把自己的公匙放在 https://launchpad.net/ 网站,并得到类似 https://launchpad.net/~showfom/+sshkeys 这样的地址,然后通过以下命令导入你的 Key
curl https://launchpad.net/~showfom/+sshkeys > ~/.ssh/authorized_keys
2、也可以直接写入 authorized_keys 文件
cat >>/root/.ssh/authorized_keys<
在某些服务商的 CentOS 系统里,由于开启了 SELinux ,默认是禁止了 .ssh 目录的权限的,可以用下面的命令解除限制:
restorecon -R -v /root/.ssh
如果遇到 authorized_keys 权限问题,可用如下命令解决:
chattr -i authorized_keys
然后你可以重启开启一个 SSH 窗口,测试是否不需要输入密码即可用 root 登陆。
第六步,关闭 SSH 密码登陆
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config
找到
#PasswordAuthentication yes
并改为
PasswordAuthentication no
保存,退出,重启 SSH 服务
Ubuntu 下:
/etc/init.d/ssh restart
CentOS 下:
/etc/init.d/sshd restart
好了,这样禁止 SSH 密码登陆就大功告成,这一步就拒绝了 90% 的入侵危险,当然,你自己的私匙一定要保存好,否则被别人偷走可是不需要密码就能进你的服务器哦。
二、安装 CSF 防火墙屏蔽尝试入侵服务器的 IP
CSF 防火墙安装略简单,几个命令即可搞定:
rm -fv csf.tgz
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
然后运行 perl /usr/local/csf/bin/csftest.pl 检测是否安装成功
为了防止系统误屏蔽本地 IP,可以修改 /etc/csf/csf.allow 和 /etc/csf/csf.ignore 文件加入你需要的白名单 IP ,然后用 csf -r 命令重启读取配置文件即可。
三、用 iptables 只开启常规端口
一般我们只需要开启 22, 53, 80, 443 这三个常见的对外开放端口,可以使用如下命令
清空 iptables 默认规则
iptables -F
允许 22 端口进入和返回
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允许 53 端口,一般作为 DNS 服务使用
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
允许本机访问本机
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许所有 IP 访问 80 和 443 端口,一般作为 http 和 https 用途
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
保存配置
iptables-save > /etc/sysconfig/iptables
重新加载 iptables
iptables -L
四、安装 fail2ban 屏蔽并举报扫描 SSH 端口的 IP
有很多精力旺盛的家伙会整天扫描 SSH 密码,当然直接关闭 SSH 密码登陆即可防止,但是为了给他们一点教训,可以安装 fail2ban ,屏蔽之余,还能自动写举报信给 IP 所在的 ISP。
CentOS 下安装:
导入 epel 源:
CentOS 6.x 32 位:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
CentOS 6.x 64 位:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装 fail2ban
yum -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
service fail2ban start
Ubuntu / Debian 下安装:
apt-get install fail2ban -y
通过查看 /var/log/fail2ban.log 文件即可知道有哪些精力过剩的家伙在整天扫描你的 SSH 了。
用户管理
用户权限
1)限制root
echo "tty1" > /etc/securetty
chmod 700 /root
2)密码策略
echo "Passwords expire every 180 days"
perl -npe 's/PASS_MAX_DAYSs+99999/PASS_MAX_DAYS 180/' -i /etc/login.defs
echo "Passwords may only be changed once a day"
perl -npe 's/PASS_MIN_DAYSs+0/PASS_MIN_DAYS 1/g' -i /etc/login.defs
用sha512保护密码而不用md5
authconfig --passalgo=sha512 --update
3)umask限制
更改umask为077
perl -npe 's/umasks+0d2/umask 077/g' -i /etc/bashrc
perl -npe 's/umasks+0d2/umask 077/g' -i /etc/csh.cshrc
4)Pam修改
touch /var/log/tallylog
cat << 'EOF' > /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
auth required pam_tally2.so deny=3 onerr=fail unlock_time=60
account required pam_unix.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
account required pam_tally2.so per_user
password requisite pam_cracklib.so try_first_pass retry=3 minlen=9 lcredit=-2 ucredit=-2 dcredit=-2 ocredit=-2
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=10
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
EOF
/var/log/tallylog是二进制日志,记录认证失败情况。可以使用pam_tally2 --reset -u username解锁
5)回收闲置用户
echo "Idle users will be removed after 15 minutes"
echo "readonly TMOUT=900" >> /etc/profile.d/os-security.sh
echo "readonly HISTFILE" >> /etc/profile.d/os-security.sh
chmod +x /etc/profile.d/os-security.sh
6)cron和at限制
echo "Locking down Cron"
touch /etc/cron.allow
chmod 600 /etc/cron.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/cron.deny
echo "Locking down AT"
touch /etc/at.allow
chmod 600 /etc/at.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/at.deny
删除系统特殊的的用户和组
userdel username
userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel operator
userdel games
userdel gopher
以上所删除用户为系统默认创建,但是在常用服务器中基本不使用的一些帐号,但是这些帐号常被黑客利用和攻击服务器。
groupdel username
groupdel adm
groupdel lp
groupdel news
groupdel uucp
groupdel games
groupdel dip
同样,以上删除的是系统安装是默认创建的一些组帐号。这样就减少受攻击的机会。
服务管理
关闭系统不使用的服务
chkconfig level 35 apmd off
chkconfig level 35 netfs off
chkconfig level 35 yppasswdd off
chkconfig level 35 ypserv off
chkconfig level 35 dhcpd off?
chkconfig level 35 portmap off
chkconfig level 35 lpd off
chkconfig level 35 nfs off
chkconfig level 35 sendmail off
chkconfig level 35 snmpd off
chkconfig level 35 rstatd off
chkconfig level 35 atd off??
定期更新系统
yum -y update,可以加入到cron job。
ssh服务安全
使用证书登录系统,具体不详述,请看这篇文章http://www.centos.bz/2012/02/strengthen-ssh-security-login-with-certificate/
LAMP安全
系统文件权限
修改init目录文件执行权限
chmod -R 700 /etc/init.d/*
修改部分系统文件的SUID和SGID的权限
chmod a-s /usr/bin/chage
chmod a-s /usr/bin/gpasswd
chmod a-s /usr/bin/wall
chmod a-s /usr/bin/chfn
chmod a-s /usr/bin/chsh
chmod a-s /usr/bin/newgrp
chmod a-s /usr/bin/write
chmod a-s /usr/sbin/usernetctl
chmod a-s /usr/sbin/traceroute
chmod a-s /bin/mount
chmod a-s /bin/umount
chmod a-s /bin/ping
chmod a-s /sbin/netreport
修改系统引导文件
chmod 600 /etc/grub.conf
chattr +i /etc/grub.conf
日志管理
1、系统引导日志
dmesg
使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。
2、系统运行日志
A、Linux 日志存储在 /var/log 目录中。
这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。
以下是常用的系统日志文件名称及其描述:
lastlog 记录用户最后一次成功登录时间
loginlog 不良的登陆尝试记录?
messages 记录输出到系统主控台以及由syslog系统服务程序产生的消息
utmp 记录当前登录的每个用户
utmpx 扩展的utmp
wtmp 记录每一次用户登录和注销的历史信息 wtmpx 扩展的wtmp
vold.log 记录使用外部介质出现的错误
xferkig 记录Ftp的存取情况 sulog 记录su命令的使用情况
acct 记录每个用户使用过的命令
aculog 拨出自动呼叫记录
B、/var/log/messages
messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。
C、/var/log/XFree86.0.log
这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。
网络安全
使用TCP_WRAPPERS
使用TCP_WRAPPERS可以使你的系统安全面对外部入侵。最好的策略就是阻止所有
的主机(在"/etc/hosts.deny" 文件中加入"ALL: ALL@ALL, PARANOID" ),然后再在"/etc/hosts.allow" 文件中加入所有允许访问的主机列表。
第一步:
编辑hosts.deny文件(vi /etc/hosts.deny),加入下面这行
# Deny access to everyone.
ALL: ALL@ALL, PARANOID
这表明除非该地址包好在允许访问的主机列表中,否则阻塞所有的服务和地址。
第二步:
编辑hosts.allow文件(vi /etc/hosts.allow),加入允许访问的主机列表,比
如:
ftp: 202.54.15.99 foo.com
202.54.15.99和 foo.com是允许访问ftp服务的ip地址和主机名称。
第三步:
tcpdchk程序是tepd wrapper设置检查程序。它用来检查你的tcp wrapper设置,并报告发现的潜在的和真实的问题。设置完后,运行下面这个命令:
[Root@kapil /]# tcpdchk
iptables防火墙使用
Web服务器的iptables规则
IPT="/sbin/iptables"
$IPT --delete-chain
$IPT --flush
$IPT -P INPUT DROP #1
$IPT -P FORWARD DROP #1
$IPT -P OUTPUT DROP #1
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #2
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT #3
$IPT -A INPUT -i lo -j ACCEPT #4
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #5
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #5
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #6
$IPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT #7
$IPT -A OUTPUT -o lo -j ACCEPT #4
$IPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT #8
$IPT -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT #9
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #10
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #10
service iptables save
service iptables restart
存为脚本iptables.sh,执行sh iptables.sh自动配置防火墙。
解释:
#1、设置INPUT,FORWARD,OUTPUT链默认target为DROP,也就是外部与服务器不能通信。
#2、设置当连接状态为RELATED和ESTABLISHED时,允许数据进入服务器。
#3、设置外部客户端连接服务器端口80,22,21,873。
#4、允许内部数据循回。
#5、允许外部ping服务器 。
#6、设置状态为RELATED和ESTABLISHED的数据可以从服务器发送到外部。
#7、允许服务器使用外部dns解析域名。
#8、设置服务器连接外部服务器端口80。
#9、允许服务器发送邮件。
#10、允许从服务器ping外部。