2014-09-04 125 views
1

我剛剛被一些互聯網文章所證實,使用setuid/setgid切換到較低特權用戶可能很重要。由於我正在開發一個網絡應用程序,我決定去www-dataNodejs:使用setuid/setgid後監聽端口80

因此,我使用userid NPM模塊計算出www-data的用戶和組ID,然後更改爲它。然而,當我做到這一點 - 這不要緊,完全 - 我得到以下(在本例中,安全處理程序的代碼非常非常底執行):

2014-09-04T23:07:05.812Z - info: BIRD3 Security -> Changed to www-data:www-data (33:33) 

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: listen EACCES 
    at errnoException (net.js:904:11) 
    at Server._listen2 (net.js:1023:19) 
    at listen (net.js:1064:10) 
    at net.js:1146:9 
    at dns.js:72:18 
    at process._tickCallback (node.js:419:13) 
    at Function.Module.runMain (module.js:499:11) 
    at startup (node.js:119:16) 
    at node.js:906:3 

正如你可以看到,只要我改變了我的權限級別,它也會降低80端口的可訪問性。

有沒有一種方法,我怎麼能實現安全,但繼續使用80端口,而無需使用something like this?

+0

你可以顯示你用來偵聽和設置gid/uid的代碼嗎? – mscdex 2014-09-05 03:09:18

+0

@mscdex:Entrence script:http://git.ingwie.me/ingwie/bird3/blob/master/app.js security_handler.js:http://git.ingwie.me/ingwie/bird3/blob/master /lib/security_handler.js 我現在註釋了setuid/setgid調用。 – 2014-09-05 18:05:17

回答

1

你不需要第三方模塊來做到這一點。 process.setgid()process.setuid()都接受ID或組名/用戶名。

還要確保您要刪除的權限偵聽端口80和您致電process.setuid()process.setgid()

實施例:

var net = require('net'); 

var srv = net.createServer(function(s) { 
}); 

srv.listen(24, function() { 
    console.log('listening'); 
}); 

process.setgid('www-data'); 
process.setuid('www-data'); 
+0

我做到了,而且我仍然遇到同樣的錯誤。還哇,不知道本機功能支持。感謝那一個壽。 :) – 2014-09-05 01:59:34

+1

在降低privs之前,你開始了哪個用戶?如果您是root用戶或等效用戶,您將只能在啓動時獲取端口80,然後在偵聽器站起來後刪除priv。 – Joe 2014-09-05 03:53:39

+0

@Joe我以root身份啓動:root,然後嘗試刪除www-data:www-data。 – 2014-09-05 20:31:03

0

是不是setgid的()和setuid的()應該連接後運行,回調響應內?

srv.listen(24, function() { 
console.log('listening'); 

process.setgid('www-data'); 
process.setuid('www-data'); 
    }); 
+0

你可以這樣鏈接嗎? process.setgid('www-data')。setuid('www-data') – 2017-11-16 05:39:14