前言

之前写过一篇在玩客云上安装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中没有讲太多,在网上搜索了解以后,过程如下:

  1. /etc/nginx/htpasswd/ttyd,这个文件中保存用户信息,格式name:password。这个文件路径可以自行调整。
  2. 其中的密码并不是明文,需要通过函数加密,可以通过openssl工具实现。比如密码是12345,执行命令openssl passwd 12345,得到的字符串$1$5PVQRvf2$uRvP6n56L9DtSXrEmBMCi1才是正确的密码格式。
  3. 将用户信息录入到文件ttyd_htpasswd中,格式:jacky:$1$5PVQRvf2$uRvP6n56L9DtSXrEmBMCi1

完成以上配置以后,可以重启ttyd、重启nginx使配置生效。此时访问ttyd,会要求输入用户信息进行认证。

第四步:修改文件权限(可选)

如果完成第三步以后服务正常可用,这一步就无需操作。

wiki中提到,一些情况下还需要修改文件权限,根据自己的情况酌情修改。

sudo chown www-data:www-data /tmp/ttyd.sock

参考文章

  1. Auth Proxy
  2. nginx配置指令auth_basic、auth_basic_user_file及相关知识
  3. Support –credential-file #1262
  4. Add file credential option #700