ttyd使用Nginx实现HTTP基本认证(HTTP Basic Authentication)
前言
之前写过一篇在玩客云上安装ttyd的博客,文章指路:【在玩客云上安装ttyd】。
ttyd默认的认证方法是在启动命令中使用-c
参数来设置用户名和密码,举例如下
ttyd -c jacky:123456 bash
这样确实很方便啊,但是有一个问题,就是使用htop
查看进程时,会发现ttyd的进程是明文的,也就是进程会显示
ttyd -c jacky:123456 bash
🤔,不管这个系统是独自使用还是多人共用,这种完全暴露用户名和密码的方式实在是让人身心不安。
那有没有其它认证的方法,比如把用户和密码信息保存在文件中,ttyd启动命令从文件中读取用户信息。
查了项目github主页的issues,很多年前就有开发者提交了这个功能的代码,但都被作者关闭、驳回了。
既然ttyd的开发者如此固执的拒绝合并这个功能的代码,那就看下怎么通过他所说的Auth Proxy
来实现。
配置
首先贴上ttyd项目wiki中提供的配置手册:【Auth Proxy】
第一步:ttyd启动命令调整
ttyd的启动命令,从之前的
ttyd -c jacky:123456 bash
调整为
ttyd -i /tmp/ttyd.sock -H X-WEBAUTH-USER bash
调整后完整版的ttyd.service配置如下
[Unit]
Description=TTYD
After=syslog.target
After=network.target
[Service]
User=[user]
ExecStart=/opt/ttyd/ttyd.armhf -p 12345 -i /tmp/ttyd.sock -H X-WEBAUTH-USER -W bash
Type=simple
Restart=always
[Install]
WantedBy=multi-user.target
第二步:nginx配置
先安装nginx这个不多说了。根据wiki中给出的nginx配置,完整版本如下,注意调整监听的端口号。
server {
listen 12345;
server_name ttyd;
location / {
auth_basic "ttyd";
auth_basic_user_file "/etc/nginx/htpasswd/ttyd";
proxy_set_header X-WEBAUTH-USER $remote_user;
proxy_set_header Authorization "";
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://unix:/tmp/ttyd.sock;
}
}
第三步:配置用户信息
这一步wiki中没有讲太多,在网上搜索了解以后,过程如下:
/etc/nginx/htpasswd/ttyd
,这个文件中保存用户信息,格式name:password
。这个文件路径可以自行调整。- 其中的密码并不是明文,需要通过函数加密,可以通过
openssl
工具实现。比如密码是12345
,执行命令openssl passwd 12345
,得到的字符串$1$5PVQRvf2$uRvP6n56L9DtSXrEmBMCi1
才是正确的密码格式。 - 将用户信息录入到文件
ttyd_htpasswd
中,格式:jacky:$1$5PVQRvf2$uRvP6n56L9DtSXrEmBMCi1
。
完成以上配置以后,可以重启ttyd、重启nginx使配置生效。此时访问ttyd,会要求输入用户信息进行认证。
第四步:修改文件权限(可选)
如果完成第三步以后服务正常可用,这一步就无需操作。
wiki中提到,一些情况下还需要修改文件权限,根据自己的情况酌情修改。
sudo chown www-data:www-data /tmp/ttyd.sock