苏苏的博客

简约至极

系统安全

Linux 系统安装方面的一些建议

Nginx安全配置

如果你是用git或者svn来部署代码,默认情况下,你的网站很可能已经泄露了.git目录,或者.svn目录

使用nginx配置过滤一切以.开头的文件和文件夹,防止被用户下载.

location ~ /\. {
	deny all;
}

每个网站都需要这么配置可能有些麻烦,你可以在统一的文件中定义好/etc/nginx/default.d/php.conf

listen 80;
index index.html index.php;
try_files $uri $uri/ /index.php?$args;
location ~ /\. {
	deny all;
}
location ~ ^.+\.php$ {
	try_files $uri =404;
	fastcgi_pass 127.0.0.1:9000;
	include fastcgi.conf;
}


location ~ [^/]\.php(/|$) {
	fastcgi_pass unix:/var/run/php-fpm.sock;
	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	try_files $fastcgi_script_name =404;
	include fastcgi.conf;
}

使用时,类似与下面,还不用每次写这么多配置了.

server{
  server_name fed-wx.xxx.cn;
  root /data/www/fed-wx;
  include /etc/nginx/default.d/php.conf;
}

给http段添加,开启一些gzip特性,关闭显示服务器版本

default_type        application/octet-stream;
sendfile            on;
tcp_nopush          on;
tcp_nodelay         on;
keepalive_timeout   65;
types_hash_max_size 2048;
server_tokens off;
ssi on;
gzip on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 3;
gzip_types text/plain text/javascript text/css text/json application/xml application/javascript  application/json image/jpeg image/gif image/png;

修改你的SSH默认端口,并且使用强密码

每天都有大量的端口扫描来扫描你服务器IP的22端口,如果你的22端口密码又不强,很可能已被黑客侵入.

如果发现已经有大量的错误登陆,请立即更换端口.必要时考虑使用fail2ban

所有的网络通信都应该使用HTTPS

http并不安全,很有可能你收到和发出的信息,已被中间人劫持.

中间人劫持能查看你发送的信息,修改返回给你的数据包.

为此,使用http时,务必加盐加密你的密码,以减少在传输过程中被窃取的可能.

更有效的是使用https来有效防止中间人劫持.

你的身份认证令牌应该多方关联.

即便使用https,你的身份认证令牌,一旦从其他渠道泄漏,黑客便能使用你的身份进行操作.

特别是具有管理员权限的身份令牌,更是会带来严重后果,在CSRF攻击中偷走令牌是常有的事.

因此你起码需要将cookie关键信息设置为httponlysecurity(使用https时),并小心过滤允许用户输入的链接地址(包含图片,视频地址)和富文本等. 必要时开启csrf-token认证.

还需要确保你的认证token在丢失以后也不能在黑客手中登陆.

这需要你在生成token时,进行多方关联,哈希时可包括IP地址,User Agent,当然用户ID也需要关联,这个token只能这个用户用.

服务器验证时并不是从token能找到用户,就验证通过,还需要对这些信息进行校验,验证还是不是那个客户端发出的.

除此之外,哈希时不能简单的哈希,还需要加盐哈希,防止黑客拆解出哈希包含的字段进而可以自己算出token.

即使黑客不能拆解你的哈希算法,也不知道哈希字段有哪些,只要他能捕获你发出的请求,(或窃取走你的token和所有可能参与哈希的字段),一样可以模拟请求,使用你的身份进行操作,除非你哈希时包含了IP. 因为来源IP黑客是无法模拟的,除非他和你在同一个外网出口IP路由下.

但如果客户的IP经常变动,IP参与哈希可能体验太不好了,于是还是回到最初的问题,

使用https,使用httponlysecurity的cookie,便能有效防止黑客捕获你的请求和偷走token

再加上token关联校验策略, 再加上token有效期滚动延期策略,三道屏障保护你的身份不被黑客冒用.

合适和正确的验证码

一上来就给用户弹验证码未免也太不友好了,合适的做法是账户最近连续3次登陆都是错误登陆再弹出高强度的验证码.

这很好实现,只需一个字段就能带来好的体验.

毕竟正常的用户大部分时间都是一次登陆成功.

用户使用过的验证码一定不能再次用来验证,要保证每次身份验证都是一个新的验证码.

不能拿一次对的验证码去重复尝试验证用户名,密码,否则等同于没有验证码.

即便使用了验证码,也是不可信的,现在的打码平台已近非常成熟了,简单的验证码也很容易做到机器识别了.

还应该限制用户登陆错误次数,一小时10次或一天30次不能再多了.

登陆和找回密码返回合适的信息

别再返回用户名不存在了,或者密码不正确

为了这一点点的客户体验,你将带来巨大的安全隐患.你的网站存在用户遍历漏洞.

黑客可以很轻松的知道一个用户有没有在你的网站注册.

黑客手中有大量的泄漏账户信息,一些有价值的账户就值得黑客深挖,通过此漏洞,黑客很容易找到哪些用户都有哪些账户.

更可怕的是,大部分人不同网站的密码是相同的.也许你的网站安全性很好,还使用了https,但是黑客只要攻破了防线最弱的那个网站拿到用户的密码,你所说的安全也就全瓦解了.

因此给出用户名或密码错误和找回密码每次都需要高强度验证码,并且返回如果你已注册,邮件已发送到您注册时的邮箱才是有效安全的方式.

可怕的撞库

大部分人不同网站的密码相同,作为使用者个人值得注意,需要为每个网站设置不同的密码,防止一个的密码泄露,其他网站的密码也不安全了.

作为系统设计者,也需要注意,最基本的密码不能明文存储,其次密码需要加盐存储.再者所有用户的盐不能都是一个,需要每个用户都有自己的盐.

做到即使被脱库,也不能直接得到密码,即使观测所有密文和盐,知道部分用户的明文密码,也不能拆解出其他用户的明文密码.(这就需要每个用户有自己的盐)

密文切记不要直接md5,或者md5加固定盐.这些都已不在安全.

修改关键信息时必须验证

为避免黑客盗取了身份认证信息,冒用正常用户,去修改邮箱,手机号等关键信息.

在修改之前一定需要二次验证.

否则手机号被修改,您账户里的财产在做变动时,验证码就发送到黑客修改过的手机上了,黑客顺利成章的就完成了交易.

邮箱和手机号已不在是有效凭据

即使使用手机号和邮箱来标示一个用户,那也不一定是正确的.

目前黑市上已经有很多成熟的产业链,黑客花少量的钱就能很快拥有数以万计的手机号和邮箱,能便捷的发送和接收验证码.

有利可图的地方就有黑客存在,在发放红利时须倍加小心.

手势解锁安全吗

大部分的手势解锁都是靠次数和时间限制,但是程序在客户端,黑客很容易修改程序配置文件,达到无限次尝试.

并且手势密码的验证大部分都是本地验证,意味着黑客根本不需要与服务器端交互,有很多方式攻破程序里的本地认证

因此手势密码只防君子,不妨小人,不要把它作为十分安全的验证,在做敏感操作时务必联网验证用户密码.

ssh 安全配置

  1. 第一阶段

修改默认ssh端口,最好修改到一个六位数端口

  1. 第二阶段

禁止root用户登陆

若要使用root权限,有两种方式

  1. 使用 sudo , (需提前配置 sudoer)
  2. 其他账户从ssh登陆后,切换到root用户(需root账户的密码)
  1. 第三阶段

禁止使用密码登陆

使用公钥和私钥登陆可避免密码被暴力破解

  1. 第四阶段

使用 port knocking

或 仅允许指定IP访问ssh端口结合用跳板机