2010-04-04 23 views
3

我有,我想作爲一個守護進程監聽低編號的端口(< 1024)我如何要求低編號的端口作爲非根的「正確的方式」

腳本是運行腳本在Python中,儘管perl中的答案也是可以接受的。

腳本正在啓動腳本使用start-stop-daemon進程化,這可能答案

我真的(認爲)不想要的是輸入PS -few,看到這個過程,運行復雜「根」就行了。

我該怎麼辦呢?

(從我的低於完全的教育 - 關於系統通話的角度來看,我可以看到3種途徑,

  1. 運行腳本作爲根(無--user/- 組/ - -chuid啓動 - 停止守護進程),並讓它在聲明端口後升級它的用戶
  2. Setuid根腳本(chmod u + s),然後以正在運行的用戶身份運行腳本(通過 - -user/- group/- chuid啓動 - 停止 - 守護進程,啓動腳本仍然必須以root身份進行調用),在腳本中獲取root權限,聲明端口,然後恢復爲普通用戶
  3. 別的東西我不知道

回答

1

選項1是Apache的httpd的取路由。如果它足夠適合世界上最流行的網絡服務器,那麼對於自己的守護進程來說,這是值得認真考慮的。

+0

s /瀏覽器/服務器 – 2010-04-04 13:48:25

+0

正確,固定(需要更多睡眠)。 – 2010-04-04 13:59:15

2

「你不知道的東西」是「功能」,但正如前面提到的elsewhere功能對使用shebang方法的腳本不能很好地發揮作用,所以這裏沒有太多的答案。我會去與「綁定端口,然後刪除權限」方法。

+0

謝謝,我很難搞清楚如何在python中正確刪除權限,你有沒有任何代碼? – qbxk 2010-04-04 12:32:55

+0

發現它,謝謝,雖然,看我的回答 – qbxk 2010-04-04 13:45:17

0

你可以安裝一個庫,如果LD_PRELOAD -ed,將假根任何可執行文件(腳本或其他方式)的權限:http://fakeroot.alioth.debian.org/

上的腳本將(至少在我的經驗)具有設置粘滯位權限沒有效果;它是ELF二進制解釋器(/ usr/bin/python,/ bin/sh,/ usr/bin/perl等),它需要粘性權限才能正常工作。你可以做的是將二進制文件複製到另一個位置,在它上面設置粘性位,然後將腳本的重點指向它。

但是,如果您在執行的系統上沒有root權限,則可以修改路由器設置以將外部端口指向1024以內的端口。

編輯:我忘了提這個小工具:redir。這是一個本地端口重定向服務。它甚至對inetd友好。

+0

Err ..有一個setuid根perl或python二進制文件躺在旁邊是強調**不是一個好主意。 – caf 2010-04-06 09:40:32

+0

@caf - 我完全同意;這只是一個建議。但是,如果二進制文件所在的目錄只能由執行腳本的用戶帳戶訪問,那麼這個安全漏洞並不算太大(當然,除了帳戶被接管的事件之外)。 – amphetamachine 2010-04-06 12:20:26

+1

這不是我們試圖通過放棄特權來防止的可能性嗎?如果接管服務與獲取根服務一樣好(因爲服務運行的用戶可以訪問setuid-root腳本解釋器),那麼你可能只需以root身份運行服務並跨越你的手指。 – caf 2010-04-06 21:51:14

2

這個網頁有一些代碼,使我吧,http://antonym.org/2005/12/dropping-privileges-in-python.html

我想設置的umask要完成這項工作,這是該代碼似乎做我的嘗試是不是唯一的東西(我'不知道設置umask的真正作用,在將它應用到進程中的情況下)

我撕裂了他的例子了一點,此外,該頁面是從2005年開始的,因此我正在重新發布我的工作解決方案這裏,

def drop_privileges(uid_name='nobody', gid_name='nogroup'): 
    # Get the uid/gid from the name 
    running_uid = pwd.getpwnam(uid_name)[2] 
    running_gid = grp.getgrnam(gid_name)[2] 

    # Try setting the new uid/gid 
    try: 
     os.setgid(running_gid) 
    except OSError, e: 
     logging.error('Could not set effective group id: %s' % e) 
     exit() 

    try: 
     os.setuid(running_uid) 
    except OSError, e: 
     logging.error('Could not set effective user id: %s' % e) 
     exit() 

    # Ensure a very convervative umask 
    new_umask = 077 
    old_umask = os.umask(new_umask) 
    logging.info('drop_privileges: Old umask: %s, new umask: %s' % \ 
      (oct(old_umask), oct(new_umask))) 

    final_uid = os.getuid() 
    final_gid = os.getgid() 
    logging.info('drop_privileges: running as %s/%s' % \ 
      (pwd.getpwuid(final_uid)[0], 
       grp.getgrgid(final_gid)[0]))