Linux非root使用者程式使用小於1024埠
在Linux下,預設埠1024下的程式是要在root下才能使用的,在其他使用者下,如果嘗試使用將會報錯。在有的時候,我們可能考慮程式執行在root帳戶下,可能會給Linux系統帶來安全風險。那如何能夠讓非root使用者執行的程式能夠對外啟用小於1024的埠呢?本文嘗試給出一些方法:
第一種方法:
SetUID
為使用者的應用程式在執行位設定user ID能夠使程式可以有root許可權來執行,這個方法讓程式能夠像在root下執行有同樣的效果,不過需要非常小心,這種方法同樣會帶來安全風險,特別是當要執行的程式本身存在安全風險。使用的方法是:
chownroot.root/path/to/application#使用SetUIDchmodu+s/path/to/application
我們可以看到在系統下,/usr/bin/passwd
這種檔案,就使用了SetUID,使得每個系統的使用者都能用passwd
來修改密碼——這是要修改/etc/passwd
的檔案(而這個只有root有許可權)。
既然要使用非root使用者執行程式,目的就是要降低程式本身給系統帶來的安全風險,因此,本方法使用的時候需要特別謹慎。
第二種方法:
CAP_NET_BIND_SERVICE
從2.1開始,Linux核心有了能力的概念,這使得普通使用者也能夠做只有超級使用者才能完成的工作,這包括使用埠1。
獲取CAP_NET_BIND_SERVICE
能力,即使服務程式執行在非root帳戶下,也能夠banding到低埠。使用的方法:
#設定CAP_NET_BIND_SERVICEsetcapcap_net_bind_service=+ep/path/to/application
Note:
1. 這個方法並不是所有Linux系統通適,核心在2.1之前的並沒有提供,因此你需要檢查要使用此方法所在系統是否支援(Linux must support capacity);
2. 另外需要注意的是,如果要執行的程式檔案是一個指令碼,這個方法是沒有辦法正常工作的(Script won't work)。
第三種方法:
Port Forwarding
如果要執行的程式有許可權監聽其他埠,那麼這個方法是可以使用的,首先讓程式執行在非root帳戶下,並繫結高於1024的埠,在確保能正常工作的時候,將低埠通過埠轉發,將低埠轉到高階口,從而實現非root執行的程式繫結低埠。要使用此方法可以使用下面的方式:
#EnabletheIPFORWARDkernelparameter.sysctl-wnet.ipv4.ip_forward=1#Useiptablesrulestoredirectpacketsiptables-F-tnatiptables-tnat-APREROUTING-ptcp--dport80-jDNAT--to:8088
第一步使用sysctl
確保啟用IP FORWARD功能(此功能在Red Hat/CentOS預設是被禁用的),注意,程式碼中使用的sysctl
設定是臨時性設定,重啟之後將會被重置,如果要長久儲存,需要在/etc/sysctl.conf
檔案內修改:
#Defaultvalueis0,needchangeto1.#net.ipv4.ip_forward=0net.ipv4.ip_forward=1
然後從檔案中載入新的配置
#loadnewsysctl.confsysctl-p/etc/sysctl.conf#orsysctl-p#defaultfilenameis/etc/sysctl.conf
第二步就是使用iptables
的規則來實現埠轉發到程式所在的埠,示例中我們要將80埠轉發到8088。
此種方法能夠比較好的達到我們的目的,我們的程式可以通過非root使用者來執行,並能夠對外提供低埠號的服務。
第四種方法:
RINETD2
這種方法使用的也是埠轉發,此工具可以將本地埠對映到遠端埠,但此功能對於我們當前的功能來說,有點雞肋,畢竟我們新增了一個額外的程式,這將可能會增加我們系統的風險性。在此不做推薦。
參考說明:
1.Linux capabilities文件,參見其中CAP_NET_BIND_SERVIC,文中的核心是否從2.1開始有這個功能並不完全確定,此資訊來自網上。
2. 官網地址:RINETD
轉載於:https://blog.51cto.com/lucifer119/1676437