热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux团队开发权限管理纪实

转自http:blog.csdn.netfbysssarticledetails5767148作者:fbysssmsn:jameslastchina@hotmail.comblog:

转自 http://blog.csdn.net/fbysss/article/details/5767148

作者:fbysss

msn:jameslastchina@hotmail.com  
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:Linux 权限管理

背景

    之前的开发服务器,所有人都是用root账号登录,一开始,用起来确是很爽很自由,也没发现什么问题。但逐渐的,几次莫名的文件丢失、数据库无法正常启动的问题,使得权限管理问题成为亟待解决的任务。实际上,仅仅是一个简单的reboot、shutdown或者是rm命令,破坏性是非常大的。而且,误操作的人也不好定位。root只能掌握在少数人手中。

一、团队构建环境,文件读写共享
    项目代码位于/svn/prj下,通过svn up更新代码,调用ant来编译、部署。那么,prj这个目录,对于每个人都是需要可读写的。
我们知道,用什么用户登录,新创建的文件宿主,就是当前用户。而默认的文件权限是644(-rw-r--r--),张三从代码仓库中update的文件,或者编译后生成的class文件,李四是没法删除的。执行ant clear必然不成功,每次都用chmod去修改相应文件,总不是个事,那怎么办呢?
    目标很明确:我们希望,开发团队中,每一个开发人员之间的权限是平等的,谁新建的文件都可以被其他人读写。
    分解出来是两个事情:
1.目录/svn/prj应该属于开发团队,即一个用户组。这很简单,建立一个组,比如叫dev,使用chown即可
     #gruopadd dev
     #useradd zhangshan

     #useradd lisi
     #useradd zhangsan -G dev -g dev

     #useradd lisi -G dev -g dev
     #chown -R :dev /svn/prj
     这里要特别说明一下,-g和-G是有区别的。-G是大家自然理解的,把一个用户加到一个组或者多个组(逗号分隔)里面去。-g呢,则是

设置用户的gid。也就是用户登陆后初始group(initial group)。
     使用id zhangsan命令,可以看到,uid=zhangsantest,gid=dev,groups=zhangsan,dev。或者使用groups zhangsan,结果是zhangsan dev
     要注意,创建一个用户,默认会创建一个同名的组,如果不加-g参数,gid就是那个组的id,新建文件,组属也是用户同名组。所以在这里,-g和-G都是缺一不可的。    
2.更改文件创建的默认权限为664(-rw-rw-r--)。

    这里涉及到一个知识,就是umask,umask主要用来控制默认创建文件或目录的权限。可以使用umask命令直接修改。在我们的linux环境中,默认的umask是022。
umask:设置哪位为1,则哪位就没有权限。放开哪位,哪位有权限。但文件例外,最高到666(默认没有执行权限)。目录则可以到777
比如设置umask为022,则目录最高可以到755,umask为002,则最高目录可以到775
    解决思路:每个用户登录都会执行一些初始化脚本,可以在脚本中修改用户的umask。
脚本片段如下:   
USERGROUP=`/usr/bin/id -Gn $USER`
echo $USERGROUP | grep -q dev
if [ $? -eq 0 ]; then 
    umask 0002
fi
意思很简单,这里不赘述。要注意的是,Linux中,应该放在/etc/bashrc里面,而不是/etc/profile中。

顺便说一下,如果有几个组都需要修改umask,可以使用grep正则或关系,比如

echo $USERGROUP | grep -q -e'dev' -e'qa'

其中的q参数,不过是代表quiet,不输出而已。
用-E大写的参数更强,相当于egrep。

比如上面的语句可以写成 echo $USERGROUP | grep -q -E 'dev|qa'


登录shell配置文件执行顺序
          /etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
我们应该把这个设置放在最后执行的文件/etc/bashrc的末尾位置,以防止设置被覆盖(实际上,linux的/etc/bashrc文件开头就有一段类似的umask设置)。
    要说明一点:控制用户对某个目录的默认读写权限,是没有直接支持的。在实际中,暂时也没必要,如果真有特殊需要,可以通过crontab设置监控进程定时进行修改,也很简单,在此不做说明。

二、普通用户的特权身份
    OK,在第一部分中,我们解决了多人文件共享读写,该运行服务器了。不就是tomcat吗,startup一下。事情没想象那么简单,Tomcat运行过程中,会写日志文件,一开始,简单的把logs目录组属划分给dev,但后来陆续又遇到一系列不同的权限问题。于是反思一下:与其一点点修改运行Tomcat涉及的那么多文件权限,不如把自己身份临时换一下?这就是我们要说的sudo。
    sudo命令就是sudoer用来执行root操作的。sudoer配置,通过visudo来编辑。
visudo实际上就是vi /etc/sudoers的包装版。但用这个命令的最大好处是,它有语法检查。

%dev ALL =NOPASSWORD: /usr/local/tomcat/bin/startup.sh
%dev ALL =NOPASSWORD: /usr/local/tomcat/bin/shutdown.sh

%dev ALL=NOPASSWORD: /usr/bin/rm /usr/local/tomcat/work/*  (注意这里的rm必须是全路径)

百分号表示组,如果是多个组,用%dev,%dev2
ALL为所有主机。如果要指定主机,可换成某个ip地址。
NOPASSWORD表示不需要sudoer输入密码。
最后为授权执行的命令全路径。
sudoer的配置还有很多,比如可以设置别名等,请读者自行学习。
执行:组员只需要在原有命令前面加上sudo 即可。

如此一来,Tomcat停启问题也解决了。
补充:sudo命令通配符的设置,如果某个目录下的所有命令都可以给sudoers开放,可以使用xxxx/*.sh,但这样一来,使用者必须使用绝对路径执行。而在当前路径也不能使用./xxx.sh。是何原因,待研究。
三、sftp用户的umask设置
似乎万事大吉了。但有一天,发现还是有一些文件没有权限覆盖,为什么呢?后来发现这部分文件,都是使用winscp上传的。
解决办法:
vi /etc/ssh/sshd_config文件,找到SubSystem sftp /usr/libexec/openssh/sftp-server这一行,修改为
SubSystem sftp /usr/libexec/openssh/sftp-server.sh
然后vi /usr/libexec/openssh/sftp-server.sh
添加
umask 0002
/usr/libexec/openssh/sftp-server
chmod 755  /usr/libexec/openssh/sftp-server.sh 即可。
当然,umask 0002这行可以跟上面的策略一致
变成
USERGROUP=`/usr/bin/id -Gn $USER`
echo $USERGROUP | grep -q developers
if [ $? -eq 0 ]; then 
    umask 0002
fi


四、NFS文件设置问题
A、B 两台服务器,A为NFS服务器,B为挂载服务器。开发中,发现这个目录老是出现权限问题。但查看组属又没什么问题。甚是奇怪。
具体事例:
一个NFS的源路径,比如是hostA:/share,该目录在hostA上的属于用户组dev,hostB mount了这个目录,看到该目录用户组是一个组号,比如105,其实就是hostA上的dev用户组号。但这个组号,在hostB上并不存在(hostB上也有一个dev组),如何让hostB上的用户也能读写该目录?最后,终于发现症结所在:两边的组号不一致,而文件的拥有者和组属,本质是认id不认name的。修改了哪边,都会让另一边无法写,产生了冲突。
解决办法:把两边的组号修改为一致。
1.首先,保证hostB上没有105号的组,如果有,则需要协调一个两边都不产生冲突的组号,可能需要修改两边的组号。
2.组号确定之后,假设105就行,在hostB上执行:groupmod –g 105 dev。变化可以通过/etc/group查看
3.重新设置改组涉及到的文件的组属。
4.属于该组的用户需要重新登录,这样才会生效。

五、root用户的行为限制

权限问题中,还有root的滥用。如果使用root来编译部署,root产生的文件,dev用户又无权访问了。也就是说,既然已经划分好了小组构建目录,每个用户都应该是dev组成员才对。root用户应该只在授权或普通用户无法解决的时候,再切换使用。


推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
author-avatar
akun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有