使用 stunnel 保護 telnet 鏈接

Telnet 是一種客戶端-服務端協議,經過 TCP 的 23 端口鏈接到遠程服務器。Telnet 並不加密數據,所以它被認爲是不安全的,由於數據是以明文形式發送的,因此密碼很容易被嗅探。可是,仍有老舊系統須要使用它。這就是用到 stunnel 的地方。linux

stunnel 旨在爲使用不安全鏈接協議的程序增長 SSL 加密。本文將以 telnet 爲例介紹如何使用它。git

服務端安裝

使用 sudo 安裝 stunnel 以及 telnet 的服務端和客戶端:github

sudo dnf -y install stunnel telnet-server telnet
複製代碼

添加防火牆規則,在提示時輸入你的密碼:安全

firewall-cmd --add-service=telnet --perm
firewall-cmd --reload
複製代碼

接下來,生成 RSA 私鑰和 SSL 證書:bash

openssl genrsa 2048 > stunnel.key
openssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt
複製代碼

系統將一次提示你輸入如下信息。當詢問 Common Name 時,你必須輸入正確的主機名或 IP 地址,可是你能夠按回車鍵跳過其餘全部內容。服務器

You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: Email Address [] 複製代碼

將 RSA 密鑰和 SSL 證書合併到單個 .pem 文件中,並將其複製到 SSL 證書目錄:socket

cat stunnel.crt stunnel.key > stunnel.pem
sudo cp stunnel.pem /etc/pki/tls/certs/
複製代碼

如今能夠定義服務和用於加密鏈接的端口了。選擇還沒有使用的端口。此例使用 450 端口進行隧道傳輸 telnet。編輯或建立 /etc/stunnel/telnet.conftcp

cert = /etc/pki/tls/certs/stunnel.pem
sslVersion = TLSv1
chroot = /var/run/stunnel
setuid = nobody
setgid = nobody
pid = /stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
[telnet]
accept = 450
connect = 23
複製代碼

accept 選項是服務器將監聽傳入 telnet 請求的接口。connect 選項是 telnet 服務器的內部監聽接口。測試

接下來,建立一個 systemd 單元文件的副原本覆蓋原來的版本:ui

sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system
複製代碼

編輯 /etc/systemd/system/stunnel.service 來添加兩行。這些行在啓動時爲服務建立 chroot 監獄。

[Unit]
Description=TLS tunnel for network daemons
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/stunnel
Type=forking
PrivateTmp=true
ExecStartPre=-/usr/bin/mkdir /var/run/stunnel
ExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/stunnel

[Install]
WantedBy=multi-user.target
複製代碼

接下來,配置 SELinux 以在你剛剛指定的新端口上監聽 telnet:

sudo semanage port -a -t telnetd_port_t -p tcp 450
複製代碼

最後,添加新的防火牆規則:

firewall-cmd --add-port=450/tcp --perm
firewall-cmd --reload
複製代碼

如今你能夠啓用並啓動 telnet 和 stunnel。

systemctl enable telnet.socket stunnel@telnet.service --now
複製代碼

要注意 systemctl 命令是有順序的。systemd 和 stunnel 包默認提供額外的模板單元文件。該模板容許你將 stunnel 的多個配置文件放到 /etc/stunnel 中,並使用文件名啓動該服務。例如,若是你有一個 foobar.conf 文件,那麼可使用 systemctl start stunnel@foobar.service 啓動該 stunnel 實例,而無需本身編寫任何單元文件。

若是須要,能夠將此 stunnel 模板服務設置爲在啓動時啓動:

systemctl enable stunnel@telnet.service
複製代碼

客戶端安裝

本文的這部分假設你在客戶端系統上以普通用戶(擁有 sudo 權限)身份登陸。安裝 stunnel 和 telnet 客戶端:

dnf -y install stunnel telnet
複製代碼

stunnel.pem 從遠程服務器複製到客戶端的 /etc/pki/tls/certs 目錄。在此例中,遠程 telnet 服務器的 IP 地址爲 192.168.1.143

sudo scp myuser@192.168.1.143:/etc/pki/tls/certs/stunnel.pem
/etc/pki/tls/certs/
複製代碼

建立 /etc/stunnel/telnet.conf

cert = /etc/pki/tls/certs/stunnel.pem
client=yes
[telnet]
accept=450
connect=192.168.1.143:450
複製代碼

accept 選項是用於 telnet 會話的端口。connect 選項是你遠程服務器的 IP 地址以及監聽的端口。

接下來,啓用並啓動 stunnel:

systemctl enable stunnel@telnet.service --now
複製代碼

測試你的鏈接。因爲有一條已創建的鏈接,你會 telnetlocalhost 而不是遠程 telnet 服務器的主機名或者 IP 地址。

[user@client ~]$ telnet localhost 450
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Kernel 5.0.9-301.fc30.x86_64 on an x86_64 (0)
server login: myuser
Password: XXXXXXX
Last login: Sun May  5 14:28:22 from localhost
[myuser@server ~]$
複製代碼

via: fedoramagazine.org/securing-te…

做者:Curt Warfield 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索