让apache可执行远程需root权限的命令
2013-04-23 22:53
190 查看
转自:http://www.linuxfly.org/post/344/
昨天提到,当想在Web页面上去调用一个需要root权限的命令时,可以使用赋予脚本suid权限,并且交换euid和uid的方式来解决。但现在又遇到一个新问题,httpd服务器与需执行的root权限命令并不在一台服务器上。也就是说,需要从Web页面上调用一个远程服务器上的需root权限的系统命令。这可是一个让人头疼的问题。
一、系统架构
先看看两台服务器的信息:
引用
Web Server: 红旗 Asianux 3.0,apache 2.0,IP:192.168.228.155
Gateway Server: 红旗 DC Server 5.0,IP:192.168.228.153
我需要实现的,就是通过点击Web Server上的按钮,然后运行一个CGI脚本,该脚本可以运行Gateway Server上的iptables命令。然后修改FORWARD表等防火墙信息。
因iptables命令需要root权限,问题就出来了。
二、解决过程
虽然问题看上去比较麻烦,实际上比suid权限来得简单。
我解决的思路是,既然要执行远程的命令,那肯定是需要进行远程登陆的。所以,我只要让Web Server上的apache用户可以远程无密码,以root用户登陆到Gateway Server上,问题自然可以解决了。
1、尝试
开始,我先在Web Server机器上,创建了其root用户到Gateway Server的密钥信任。有:
引用
# ssh 192.168.228.153
Last login: Tue Mar 17 18:22:33 2009 from 61.144.140.56
[root@printserver ~]#
然后,修改CGI脚本:
my $HTML=qx(/usr/bin/ssh -l root 192.168.228.153 /sbin/iptables -L);
访问页面,报503错误。httpd后台日志报:
引用
[Fri Mar 19 21:21:44 2009] [error] [client 10.8.1.10] Could not create directory '/var/www/.ssh'.\r
[Fri Mar 19 21:21:44 2009] [error] [client 10.8.1.10] Host key verification failed.\r
当然,这是可以预见的。虽然root用户做了密钥信任,但httpd服务是以apache用户执行的,所以没有作用。
但这可以给我们一个提示,是否只要给apache用户做密钥信任就可以了?
2、给apache用户做密钥信任
先看看apache用户的信息:
引用
# su - apache
This account is currently not available.
# cat /etc/passwd|grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
看来直接切换到apache用户来做是不行了。做个中转吧。
◎ 创建一个临时主目录
# mkdir -p /home/apache
# chown apache.apache /home/apache/ -R
◎ 修改apache用户的信息
引用
# usermod -s /bin/bash -d /home/apache/ apache
# cat /etc/passwd|grep apache
apache:x:48:48:Apache:/home/apache/:/bin/bash
◎ 切换到apache用户,并实现密钥信任
创建密钥:
引用
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/apache//.ssh/id_rsa):
Created directory '/home/apache//.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/apache//.ssh/id_rsa.
Your public key has been saved in /home/apache//.ssh/id_rsa.pub.
The key fingerprint is:
94:16:24:6b:53:31:46:63:56:97:d4:0f:79:9c:2e:a3 apache@ftpserver
拷贝公钥:
引用
$ cat .ssh/id_rsa.pub |ssh -l root 192.168.228.153 'cat - >> /root/.ssh/authorized_keys'
RSA key fingerprint is 9a:f4:88:16:c7:4d:22:0b:b9:0a:47:ec:27:80:66:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.228.153' (RSA) to the list of known hosts.
root@192.168.228.153's password:
$
尝试远程登陆:
引用
$ ssh -l root 192.168.228.153
Last login: Wed Mar 18 16:04:52 2009 from rfgz.3322.org
[root@printserver ~]#
密码信任创建成功。但我们还需要还原apache用户的信息,而其原主目录是/var/www/,所以,需要拷贝证书到对应的路径上。
◎ 拷贝证书
用apache用户本身是不能进行的,需要以管理员操作:
引用
$ cp -a .ssh/ /var/www/
cp: 无法创建目录 “/var/www/.ssh”: 权限不够
$ ll /var/www -d
drwxr-xr-x 11 root root 4096 12-01 18:44 /var/www
$ exit
# cd /home/apache/
# cp -a .ssh/ /var/www/
◎ 恢复apache用户的主目录
# usermod -d /var/www apache
◎ 再实施信任关系
引用
# su - apache
$ pwd
/var/www
$ ssh -l root 192.168.228.153
Last login: Wed Mar 18 16:06:49 2009 from 192.168.228.135
[root@printserver ~]#
至此,信任关系应该是做好了。
◎ 恢复apache用户信息,删除临时文件
引用
$ exit
logout
# usermod -s /sbin/nologin apache
# rm -rf /home/apache/
3、重新尝试执行远程命令
CGI脚本不需要修改,代码是:
#!/usr/bin/perl -w
use strict;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
print header (-charset=>"gb2312");
print scalar localtime();
my $HTML=qx(/usr/bin/ssh -l root 192.168.228.153 /sbin/iptables -L);
print "<br>",$HTML;
print "<br>End";
浏览器结果:
Gateway Server上的系统日志显示:
引用
Mar 18 16:31:35 printserver sshd[716]: Accepted publickey for root from 192.168.228.155 port 59779 ssh2
信任关系通过,远程执行root权限命令成功。
二、其他
1、用于解决本地问题
sshd是服务端、客户端应用程序,完全可以把本地同时作为服务端和客户端。也就是说,把apache用户的id_rsa.pub拷贝到本地的root用户下的~/.ssh/authorized_keys文件中,即可解决Web上执行本地root权限命令的问题。
2、安全
这是一说再说的问题了,root的权限是非常大的,务必做好信息输入的安全检查,防止漏洞。
相关日志
[原]Apache 因SSL Library Certificate has expired 无法启动
[原]打开VMware ESXi 5.0 上的SSH 支持
[原]演示使用relaxscan暴力破解SSH
[原]使用DenyHosts 阻止SSH暴力破解
[原]Apache中虚拟主机设置泛域名解析
Tags: ssh , apache
fengfeng919
2011/05/17 16:05
首先感谢你的文章,写得很不错,思路很清晰!不知道能否把这思路运用到通过web方式来智能监控远程服务器的一些情况,而目前我们接触到的开源工具都是发现问题然后报警而已,没有智能解决问题的功能!具体的思路我是想这样做:
网页通过调用shell最好是perl的脚步来取得远程服务器的信息,根据具体指标显示其是否处于健康状态,如果非健康状态,网页的下方会存在一个下拉列表,下拉列表里自然是很多远程服务器的IP地址,然后列表旁边是一些列的动作,例如重启、关机、执行特定脚步(这些就直接使用你上面的方法即可) !
linuxing 回复于 2011/05/20 13:31
要实现你说的功能不困难,就是做个状态触发,通知页面即可,很多方式都可以做到的。但通常的监控工具不会提供这样的功能,主要是安全性问题。处理不好,会带来很多意外问题的。若你真的要实现,建议用wheel组,或配置sudo,代替直接提供root权限。
昨天提到,当想在Web页面上去调用一个需要root权限的命令时,可以使用赋予脚本suid权限,并且交换euid和uid的方式来解决。但现在又遇到一个新问题,httpd服务器与需执行的root权限命令并不在一台服务器上。也就是说,需要从Web页面上调用一个远程服务器上的需root权限的系统命令。这可是一个让人头疼的问题。
一、系统架构
先看看两台服务器的信息:
引用
Web Server: 红旗 Asianux 3.0,apache 2.0,IP:192.168.228.155
Gateway Server: 红旗 DC Server 5.0,IP:192.168.228.153
我需要实现的,就是通过点击Web Server上的按钮,然后运行一个CGI脚本,该脚本可以运行Gateway Server上的iptables命令。然后修改FORWARD表等防火墙信息。
因iptables命令需要root权限,问题就出来了。
二、解决过程
虽然问题看上去比较麻烦,实际上比suid权限来得简单。
我解决的思路是,既然要执行远程的命令,那肯定是需要进行远程登陆的。所以,我只要让Web Server上的apache用户可以远程无密码,以root用户登陆到Gateway Server上,问题自然可以解决了。
1、尝试
开始,我先在Web Server机器上,创建了其root用户到Gateway Server的密钥信任。有:
引用
# ssh 192.168.228.153
Last login: Tue Mar 17 18:22:33 2009 from 61.144.140.56
[root@printserver ~]#
然后,修改CGI脚本:
my $HTML=qx(/usr/bin/ssh -l root 192.168.228.153 /sbin/iptables -L);
访问页面,报503错误。httpd后台日志报:
引用
[Fri Mar 19 21:21:44 2009] [error] [client 10.8.1.10] Could not create directory '/var/www/.ssh'.\r
[Fri Mar 19 21:21:44 2009] [error] [client 10.8.1.10] Host key verification failed.\r
当然,这是可以预见的。虽然root用户做了密钥信任,但httpd服务是以apache用户执行的,所以没有作用。
但这可以给我们一个提示,是否只要给apache用户做密钥信任就可以了?
2、给apache用户做密钥信任
先看看apache用户的信息:
引用
# su - apache
This account is currently not available.
# cat /etc/passwd|grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
看来直接切换到apache用户来做是不行了。做个中转吧。
◎ 创建一个临时主目录
# mkdir -p /home/apache
# chown apache.apache /home/apache/ -R
◎ 修改apache用户的信息
引用
# usermod -s /bin/bash -d /home/apache/ apache
# cat /etc/passwd|grep apache
apache:x:48:48:Apache:/home/apache/:/bin/bash
◎ 切换到apache用户,并实现密钥信任
创建密钥:
引用
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/apache//.ssh/id_rsa):
Created directory '/home/apache//.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/apache//.ssh/id_rsa.
Your public key has been saved in /home/apache//.ssh/id_rsa.pub.
The key fingerprint is:
94:16:24:6b:53:31:46:63:56:97:d4:0f:79:9c:2e:a3 apache@ftpserver
拷贝公钥:
引用
$ cat .ssh/id_rsa.pub |ssh -l root 192.168.228.153 'cat - >> /root/.ssh/authorized_keys'
RSA key fingerprint is 9a:f4:88:16:c7:4d:22:0b:b9:0a:47:ec:27:80:66:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.228.153' (RSA) to the list of known hosts.
root@192.168.228.153's password:
$
尝试远程登陆:
引用
$ ssh -l root 192.168.228.153
Last login: Wed Mar 18 16:04:52 2009 from rfgz.3322.org
[root@printserver ~]#
密码信任创建成功。但我们还需要还原apache用户的信息,而其原主目录是/var/www/,所以,需要拷贝证书到对应的路径上。
◎ 拷贝证书
用apache用户本身是不能进行的,需要以管理员操作:
引用
$ cp -a .ssh/ /var/www/
cp: 无法创建目录 “/var/www/.ssh”: 权限不够
$ ll /var/www -d
drwxr-xr-x 11 root root 4096 12-01 18:44 /var/www
$ exit
# cd /home/apache/
# cp -a .ssh/ /var/www/
◎ 恢复apache用户的主目录
# usermod -d /var/www apache
◎ 再实施信任关系
引用
# su - apache
$ pwd
/var/www
$ ssh -l root 192.168.228.153
Last login: Wed Mar 18 16:06:49 2009 from 192.168.228.135
[root@printserver ~]#
至此,信任关系应该是做好了。
◎ 恢复apache用户信息,删除临时文件
引用
$ exit
logout
# usermod -s /sbin/nologin apache
# rm -rf /home/apache/
3、重新尝试执行远程命令
CGI脚本不需要修改,代码是:
#!/usr/bin/perl -w
use strict;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
print header (-charset=>"gb2312");
print scalar localtime();
my $HTML=qx(/usr/bin/ssh -l root 192.168.228.153 /sbin/iptables -L);
print "<br>",$HTML;
print "<br>End";
浏览器结果:
Gateway Server上的系统日志显示:
引用
Mar 18 16:31:35 printserver sshd[716]: Accepted publickey for root from 192.168.228.155 port 59779 ssh2
信任关系通过,远程执行root权限命令成功。
二、其他
1、用于解决本地问题
sshd是服务端、客户端应用程序,完全可以把本地同时作为服务端和客户端。也就是说,把apache用户的id_rsa.pub拷贝到本地的root用户下的~/.ssh/authorized_keys文件中,即可解决Web上执行本地root权限命令的问题。
2、安全
这是一说再说的问题了,root的权限是非常大的,务必做好信息输入的安全检查,防止漏洞。
相关日志
[原]Apache 因SSL Library Certificate has expired 无法启动
[原]打开VMware ESXi 5.0 上的SSH 支持
[原]演示使用relaxscan暴力破解SSH
[原]使用DenyHosts 阻止SSH暴力破解
[原]Apache中虚拟主机设置泛域名解析
Tags: ssh , apache
fengfeng919
2011/05/17 16:05
首先感谢你的文章,写得很不错,思路很清晰!不知道能否把这思路运用到通过web方式来智能监控远程服务器的一些情况,而目前我们接触到的开源工具都是发现问题然后报警而已,没有智能解决问题的功能!具体的思路我是想这样做:
网页通过调用shell最好是perl的脚步来取得远程服务器的信息,根据具体指标显示其是否处于健康状态,如果非健康状态,网页的下方会存在一个下拉列表,下拉列表里自然是很多远程服务器的IP地址,然后列表旁边是一些列的动作,例如重启、关机、执行特定脚步(这些就直接使用你上面的方法即可) !
linuxing 回复于 2011/05/20 13:31
要实现你说的功能不困难,就是做个状态触发,通知页面即可,很多方式都可以做到的。但通常的监控工具不会提供这样的功能,主要是安全性问题。处理不好,会带来很多意外问题的。若你真的要实现,建议用wheel组,或配置sudo,代替直接提供root权限。
相关文章推荐
- 让lampp的nobody用户可执行远程需root权限的命令
- 9.漏洞验证系列--Apache Struts2 远程命令执行(S2-045)
- Apache shiro 1.2.4版本远程命令执行漏洞详解
- Apache Struts2远程命令执行漏洞呈爆发趋势
- shell: 普通用户如何以root权限执行远程服务器上的命令_20160706_七侠镇莫尛貝
- 利用apache common-net 操作telnet远程执行命令
- shell: 普通用户如何以root权限执行远程服务器上的命令_20160706_七侠镇莫尛貝
- Apache Struts远程命令执行漏洞、开放式式重定向漏洞
- Apache Struts2 includeParams属性远程命令执行漏洞(CVE-2013-1966)
- Apache Struts2 多个前缀参数远程命令执行漏洞及测试方法
- Apache Struts2 远程命令执行漏洞
- 网站安全加固之apache环境S2-057漏洞 利用POC 远程执行命令漏洞复现
- 关于Apache Struts2 新增远程命令执行高危漏洞的情况通报
- saltstack执行远程命令
- JAVA RMI 反序列化远程命令执行漏洞
- linux shell 远程执行命令
- 快客电邮(QuarkMail)远程命令执行漏洞
- c#远程执行命令备忘
- ssh远程执行命令方法和Shell脚本实例
- 关于zabbix执行linux远程命令未生效问题