1. 程式人生 > 實用技巧 >Linux非root使用者程式使用小於1024埠

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