服务器和mysql权限控制
今天冬至,知道公司会提早下班(4点),以为是美好的一天,咋知道搞出一点问题,中午处理故障基本没睡 = =(惨~)
一、需求引入
这两天不知道什么原因,客户要求给线上服务器和数据库查看权限。因为问他们也告诉开权限的原因,我们经理觉得不太安全,于是叫我,配置
(1)针对服务器,程序运行目录只有查看权限,其他目录不让看
(2)针对数据库:只查不让改。
二、问题解决
对于数据库,昨天已经搞过,所以十拿九稳。无非就是grant个select权限给一个新开用户。核心命令:
grant select on 数据库.* to 用户@'%' identified by '用户密码';
因为考虑到客户那边经常不讲武德地去扫开启端口(害我写了不少整改文档。。),所以当时经理问我意见的时候,我说直接放堡垒机访问,好处有三:其一不需要让客户知道数据库的登录密码,其二能审计他们行为,最后能在安全组里设置端口开放范围(昨天设置的数据库权限刚好又是在ECS搭的mysql)
害我中午基本没睡的是服务器的权限设置。第一次弄,我以为很顺利~
话说我们服务器跑程序的账号权限颇大(假设是ljy用户,组也是ljy),也装了各种东西,如nginx之类的。给客户只看的目录,这里假设是:/home/ljy/app/service。
当时查到有个setfacl的命令可以给目录添加acl规则。本来想慢慢研究的,经理说很急,客户等着。只能用心里有点谱的 chmod 和 usermod去搞。
思路就是:
(1)给客户建一个登录账号,假设是:program
(2)将program用户添加到ljy组。
usermod -g ljy program
(3)授权。先贴上关键命令
chmod 750 /home/ljy chmod 750 /home/ljy/app/service ##给用户只看权限,750和755都行。其他用户权限不管 chmod 740 /home/ljy/{ljy下的其他目录或文件}
正常来说,program用户只能看到自己家目录:/home/program/ 下面东西,现在需要进去ljy家目录,需要给/home/ljy 设置至少 750 权限。如果不给x权限,无法进去 /home/ljy目录下。其他目录因为是不让program用户看的,740和700都可以。只看权限的目录 750 可以了。
给大家看看效果,再说坑
gst(打马赛克了,大家将就看) 和 nginx目录都是744,pe目录是755。尝试去看gst目录会报错:Permission denied。pe目录进去删除或新建什么,都会报错。只能看!
其实到这里基本就完成任务。然后我开始作死了。
尝试用program用户,去根目录做骚操作,发现有些目录可以做坏事哦(没错,是我之前开大了权限,事后我发现其实你单独改回来不好,干嘛全部目录一起设置)。于是为了安全起见,就闭眼运行了:
chmod 755 /
想着这样除root用户其他用户啥事都搞不了。运行到一半,ssh自动断开了,可幸的是上面跑着的服务端口能通。telnet那台服务器的ssh端口和其他同网段机器ssh过去,都连不上。以为又要开单用户模式改回来,还要停业务重启机器,还要发公告,我已经脑补了晚上要加班重启机器进单用户了。
当时吓坏了,边提工单边查资料。幸好阿里提供了VNC远程连接,不受ssh端口安全组限制(https://help.aliyun.com/document_detail/25433.htm)。要是天翼的话,没得救 = =,估计要被批斗了(经常想着这种高危职业,应该为自己买份保险。。)
原来,/etc/ssh 目录下面权限有着非常严格的设置。改错会导致无法ssh连接。
设置成755,或者其他权限就ssh连不上了。
还有这玩意,得 chmod 777 /dev/null
这个/tmp 权限,要:chmod -R 1777 /tmp
/ 根分区后来的权限设置,我对着另一台服务器改了第一层目录了,至于有没有遗漏(报错再设置回来权限吧),所幸不需要重启机器,不然,呵呵= = 。
(冬至也是累死人,完~)