需求:限制用户权限,仅提供一些linux常用命令,用户监控linux系统于网络运行情况,不允许用户ssh登录后随意运行linux命令
-
用户不能进入到Shell环境
例如普通用户一旦登录web服务器可以看到web程序中的数据库配置
-
用户可以了解OS工作状态如内存,cpu,网络等等
例如:ping, tracepath, top, free, netstat
-
可以查看系统部分日志
例如:access.log, error.log, php-error.log ...
使用mgmt替代bash
#!/bin/bash
TITLE="Client"
#USER=$(whiptail --inputbox "User:" 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)
#PASSWD=$(whiptail --title "$TITLE" --passwordbox "Passsword:" 8 60 3>&1 1>&2 2>&3)
COMMAND=$(whiptail --title "$TITLE" --menu "Administrator Tools" 22 50 10 \
"ping" "ping" \
"tracepath" "tracepath" \
"top" "top" \
"free" "free" \
"ps" "ps" \
"netstat" "netstat" \
"lsof" "lsof" \
"iftop" "iftop" \
"log" "log" \
3>&1 1>&2 2>&3)
function option(){
OPTION=$(whiptail --inputbox "COMMAND-LINE Options: " 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)
}
function weblog(){
LOG=$(whiptail --title "$TITLE" --menu "Logs" 22 50 8 \
"/var/log/messages" "message" \
"/var/log/syslog" "syslog" \
"/var/log/nginx/access.log" "access.log" \
"/var/log/nginx/error.log" "error.log" \
3>&1 1>&2 2>&3)
}
case $COMMAND in
ping)
option
$COMMAND $OPTION
;;
tracepath)
option
$COMMAND $OPTION
;;
free)
$COMMAND -m
read
;;
top|iftop)
$COMMAND
;;
log)
weblog
tail -f $LOG
;;
ps|lsof)
option
$COMMAND $OPTION
read
;;
netstat)
option
$COMMAND $OPTION
read
;;
*)
exit $?
esac
Shell 启动文件,主要用户隐藏 /srv/sbin/mgmt 文件(针对菜鸟)
$ cat shell.c
#include <stdlib.h>
main()
{
for (;;){
system("/srv/sbin/mgmt");
}
}
编译.c文件
gcc shell.c -o /bin/nsh
添加Shell到/etc/shells
echo /bin/nsh >> /etc/shells
将用户shell更改为我们刚刚创建的nsh
$ vim /etc/passwd
www:x:33:33:www:/var/www:/bin/nsh
现在来作一个测试,如果正确应该现在为下面的TUI界面
ssh www@example.com
┌───────────────────┤ Client ├───────────────────┐
│ Administrator Tools │
│ │
│ ping ping │
│ tracepath tracepath │
│ top top │
│ free free │
│ ps ps │
│ netstat netstat │
│ lsof lsof │
│ iftop iftop │
│ log log │
│ │
│ │
│ <Ok> <Cancel> │
│ │
└────────────────────────────────────────────────┘
提示
这里采用的方式是给用户提供一个界面的方式,另外还有更好的方案,你可以些一个Shell的外壳,你需要实现
-
与Shell相同的提示符
-
提供TAB补齐
-
上下光标键翻看历史命令,左右光标改变位置,Home/End 键到行首与行尾
-
Ctrl+R 搜索, Ctrl+D 退出
-
Ctrl+S,Ctrl+Q 等等
流程
用户输入 -> 关键字过滤 -> 放行
例如用户输入 cd / 经过过滤器后, cd /home/usr/
例如用户输入 cd /aaa 经过过滤器后, cd /home/usr/aaa
rm -rf /usr/local 提示拒绝等等
我已经使用Python实现上面的大部分功能(因为python受到很多限制)如果使用C可以100%实现,需要你的想想力了
SA的操作记录问题
通过~/.bash_history文件记录系统管理员的操作记录,定制.bash_history格式
HISTSIZE=1000
HISTFILESIZE=2000
HISTTIMEFORMAT="%Y-%m-%d-%H:%M:%S "
export HISTTIMEFORMAT
看看实际效果
$ history | head
1 2012-02-27-09:10:45 do-release-upgrade
2 2012-02-27-09:10:45 vim /etc/network/interfaces
3 2012-02-27-09:10:45 vi /etc/network/interfaces
4 2012-02-27-09:10:45 ping www.163.com