1. 程式人生 > >讓apache可執行遠端需root許可權的命令

讓apache可執行遠端需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
[[email protected] ~]#
然後,修改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
[email protected]

拷貝公鑰:
引用 $ 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.
[email protected]'s password:
$
嘗試遠端登陸:
引用 $ ssh -l root 192.168.228.153
Last login: Wed Mar 18 16:04:52 2009 from rfgz.3322.org
[[email protected] ~]#
密碼信任建立成功。但我們還需要還原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
[[email protected] ~]#
至此,信任關係應該是做好了。

◎ 恢復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執行遠端root許可權命令

 昨天提到,當想在Web頁面上去呼叫一個需要root許可權的命令時,可以使用賦予指令碼suid許可權,並且交換euid和uid的方式來解決。但現在又遇到一個新問題,httpd伺服器與需執行的root許可權命令並不在一臺伺服器上。也就是說,需要從Web頁面上呼叫一個遠端伺服器上的需root許可權的系統命令。這

lampp的nobody使用者執行遠端root許可權命令

$ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/home/apache//.ssh/id_rsa):Created directory '/home/apache//

制定程式碼規範並不難,但你知道如何執行嗎?

策劃:erichua23 編輯:郭蕾 回想起來自己工作這麼些年,也經歷了不少團隊,經歷的專案更不算少了, 但是要說到程式碼規範, 問我我經歷的這些程式碼規範是不是滿意,我不得不如實回答:不是很滿意。當然我自己的程式碼規範和風格也沒有完全固化下來,近一年左右也開始關注到這個問題,為了讓自己的程式碼風

設定mysql遠端連線root許可權

在遠端連線mysql的時候應該都碰到過,root使用者無法遠端連線mysql,只可以本地連,對外拒絕連線。需要建立一個允許遠端登入的資料庫帳戶,這樣才可以進行在遠端操作資料庫。方法如下:預設情況下MYSQL資料庫的系統資料庫mysql系統表user內使用者許可權只提供loc

vue不是執行的內部或外部命令

以前vue安裝在win10上,幾乎是一路順暢,今天純淨win7環境,結果裝完之後,vue命令用不了了, 看了一下win10的vue是什麼東西 where vue,發現是一個cmd處理檔案,然後就在win7上找一下,不能用where vue了,如果系統找得到vue,就不會報錯了,通過檔案查詢,

Ubuntu進入root許可權命令——sudo和su命令詳解

ubuntu使用者管理 sudo意思就是super-user do,讓當前使用者暫時以管理員的身份root來執行這條命令。 su是用來改變當前使用者的,su root,就是將當前使用者切換為root,用了su root之後,下面所有的命令就可以不用打sudo了,因為當前使

如何PHP通過ROOT許可權執行LINUX命令

一般 PHP 在 LINUX 伺服器上執行 shell 命令時,只能擁有 www:www 賬戶許可權,想執行一些系統命令是沒有許可權的,如重啟 apache,因為控制 apache 需要 root 許可權,因此下面的辦法可以讓 PHP 執行 ROOT 許可權的命令。 1

PHP以ROOT許可權執行系統命令的方法&SUID,SGID,SBIT許可權的作用和設定

SUID:只對二進位制程式支援,只要擁有該程式的所有者擁有SUID的許可權,那麼其它使用者或者同組使用者擁有該程式的x許可權,就可以在程式執行過程中擁有所有者的許可權支援。 例如:(在root下操作) 有一檔案text的內容是hello world!,現在編寫一個讀出該檔案內容的程式 程式如下: 程式名為r

Apacheroot許可權執行CGI

問題場景 Apache預設是以daemon使用者(或者其他other使用者)和daemon使用者組啟動的,所以其worker程序也是daemon許可權的,這樣,worker程序fork的CGI程序,以及CGI再fork的子程序,都是daemon許可權的。如果想

為什麼執行ping命令時不需要root許可權? 怎樣程序具有root許可權

     最近遇到一個問題, 需要讓普通使用者執行程式時具有root許可權, 怎麼辦呢?     我們來看看ping, 它採用了raw socket, 需要root許可權, 但是, 我們平常執行root命令的時候, 沒有加sudo啊, 來探個究竟:ubuntu@VM-0-15

Linux學習筆記之如何普通使用者獲得ROOT許可權

  在學習sodu的時候,我發現一些命令只能由root使用者使用,普通使用者使用會提示此使用者沒有使用sudo的許可權。我想到的解方法是把正在使用的普通使用者獲得root許可權,於是我通過百度和詢問老師知道了如何去實現。   舉例: 1.建立一個新使用者boy,密碼:123456(

Android 8.1 新增屬性SystemProperties.set執行許可權

在Android 8.1由於selinux許可權的限制。預設SystemProperties.set執行報avc denied,即使給 app android:sharedUserId="android.uid.system"許可權也不行,如果想執行必須修改一些檔案。 device/

sudo普通使用者使用root許可權執行命令

修改/etc/sudoers 裡面有一行 ## Allow root to run any commands anywhere  root    ALL=(ALL)       ALL 用cat /etc/sudoers命令檢視

how to mount /system as read/write in android? 在除錯RK3288的OV2718的驅動時,需要remount /system目錄為rw以push檔案到/system/lib/hw目錄下,常規的是用adb登入上去後以root許可權執行mount -o re

在除錯RK3288的OV2718的驅動時,需要remount  /system目錄為rw以push檔案到/system/lib/hw目錄下,常規的是用adb登入上去後以root許可權執行mount -o remount,rw /system即可,然而在拿的新板子後這麼做失效了,於是百

如何給linux檔案新增執行許可權

1、u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。 2、r 表示可讀取,w 表示可寫入,x 表示可執行。   執行命令“chmod a+x 檔名”,“chmod a+w 檔名” 一般情況下我們需要給

如何高德/百度地圖的sdk直接執行在真機上

       或許大家都有遇到過在百度地圖或者是高德地圖上註冊key簽名時放置到自己的manifest中,會發現直接執行真機是會無效(地圖無法顯示/無法定位),一定要另外打包才可現實相關三方資訊,比如地圖的顯示。在這做個筆記,剛好解決了這個問題,今天要講的

使用maven-assembly-plugin外掛,將maven管理的遠端和本地依賴jar包打入執行jar包

最近在修改一個小工具,原來的做法是把依賴包都下載到本地目錄,打包時候使用fatjar打包整個專案依賴;現在修改為maven管理依賴包,使用maven-assembly-plugin外掛打包;如果依賴包全部是遠端預設的依賴配置,這樣沒有問題;但裡面有些是自己實現的本地依賴,這個

Pycharm以root許可權執行指令碼

    因為許可權不夠,導致Pycharm在執行指令碼時報錯: socket.error: [Errno 1] Operation not permitted     網上有一些修改檔案使得Pycharm執行指令碼時可以不需要密碼的以root許可權執行

CentOS下新增使用者並且使用者獲得root許可權

//新增一個名為tommy的使用者 #passwd tommy   //修改密碼 Changing password for user tommy. New UNIX password:     //在這裡輸入新密碼 Retype new UNIX password:  //再次輸入新密碼 passwd:

CentOS 7下新建使用者並設定為提升為ROOT許可權

第一步:新增使用者 命令: adduser tom 第二步:修改密碼 命令: passwd tom 根據提示輸入兩次密碼,完成密碼設定。 第三步:設定使用者許可權 方法一:修改 /etc/sudoers 檔案(推薦方法) 命令: