在Linux下的用户特殊操作权限控制

需求背景如下:希望确保开发人员从SVN提取代码进行部署,而不是从本机上传程序,但因为要允许开发人员自行启停服务,所以变更用户需提供给开发人员,因此问题就是如何对变更用户进行控制,不允许进行除编译部署及启停服务的其他操作。

因此进行了如下考虑:

  1. 用户登录时就加载shell脚本
  2. 脚本不允许通过Ctrl+C中断结束
  3. 脚本退出时自动断开当前登录,自动登出
  4. 脚本通过密码或其他认证可以回到正常命令行
  5. 阻止用户通过FTP方式登录进行文件修改
  6. 阻止用户通过SFTP方式登录进行文件修改

可以通过以下配置达到这些效果(登录使用bash,FTP使用vsftp,所以使用其他shell或FTP的话,需根据实际情况进行调整):

一、新建一个shell脚本,并在变更用户的.bash_profile文件中调用该脚本

二、在shell脚本中,通过对中断信号进行捕获,防止Ctrl+C退出脚本

	trap "tput rc" SIGINT SIGTSTP

我这里使用tput rc将捕获的中断信号进行处理,是因为在我的脚本当中,提供了一个界面菜单,当使用其他按键时,会恢复光标到输入位置,就类似于输入无效的效果,实际使用中,可以用echo之类的语句进行提示。

需要注意的是,如果在shell当中调用了其他的一些程序或脚本,可能执行结束后,会将trap进行调整,因此在调用外部程序或脚本后,最好再执行一次trap进行中断信号的捕获。

三、在shell脚本的最后,使用语句中断当前登录的用户,自动登出

	kill -9 $(ps|awk '/bash/{print $1}')

研究了好久,发现还是这个语句的效果最好,之前研究过用exit之类的,绕了半天没搞定(也有可能我功力不足)。

四、在shell脚本中,根据IP及密码允许部分用户回到命令行

	ipaddr=`who am i | awk '{print $5}'`
	grep "$ipaddr" /esb/etc/allowip >/dev/null 2>&1
	if [ $? -ne 0 ]; then
		echo -n "             Not Allowed..."
		read -n 1
	else
		echo -n "             Please Enter Password: "
		read -s password
		password=`echo $password | md5sum`
		grep "$password" /esb/etc/password >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			echo -n "             Password Error..."
			read -n 1
		else
			echo 
			exit
		fi
	fi

不进行过多解释了,主要就是将允许的ip和密码,存储在文件中,然后通过grep判断是否符合,都符合就通过exit回到命令行,否则就还在停留在shell当中。

五、调整vsftp配置,禁止变更用户登录(使用root用户进行配置)

修改vsftp配置文件/etc/vsftpd/ftpusers,将变更用户加入其中,禁止通过ftp登录。

六、调整sshd配置,禁止SFTP登录(使用root用户进行配置)

修改sshd配置文件/etc/ssh/sshd_config,将最后一行加上井号进行注释

#Subsystem      sftp    /usr/libexec/openssh/sftp-server

使用语句重启sshd服务

service sshd restart

已知问题:

由于sshd服务与scp是绑在一起的,实际在拥有变更用户密码后,是可以通过其他机器,使用ssh或scp远程连上该服务器操作指令,只是没有交互界面而已,要彻底的话,可以禁用ssh服务,只用telnet方式,就不存在这个问题了。由于只是内部管理用,感觉没必要弄到这么严格,所以也就没有进一步再做控制。禁用sshd的话,把服务停掉就行了,很简单就不多说了。