CentOS下搭建WebSSH并配置密码访问

自己平时比较喜欢折腾,手上有一些linux系统的vps,有的时候不在家里或者办公室没有SSH客户端,管理这些vps比较麻烦。这几天在网上逛,发现可以通过搭建网页版的SSH客户端,这下就方便了。只要把webssh放在一台网络比较友好的vps上,那么几乎可以实现随时随地方便地连接和管理我的vps了。今天,就尝试着把网上看到的一些东西整合一下,记录自己搭建网页端webssh的全过程。
安装docker和docker-compose
# 下载docker安装脚本 $ curl -fsSL get.docker.com -o get-docker.sh $ sudo sh get-docker.sh $ sudo systemctl start docker $ sudo systemctl enable docker # 下载docker-compose二进制文件 $ curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 $ sudo chmod +x /usr/local/bin/docker-compose # 创建软链接 $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 测试是否安装成功 $ docker-compose version
设定docker-compose设置文件并运行
# 用lnmp vhost add命令新增网站,进入网站目录,创立并编辑docker-compose.yml文件 $ vim docker-compose.yml
将以下配置写入文件中
version: '3' services: webssh: image: dbcawa/webssh container_name: webssh ports: - 9008:8888 restart: always privileged: true
运行docker-compose
# 启动docker-compose $ docker-compose up -d
这时候,理论上来说,访问域名的9008端口,就可以看到webssh的界面了。但实际上,为了安全考虑,webssh是不允许公网上非加密访问的,明文传输很容易被嗅探失去安全。这时,会出现如下错误页面
查看docker-compose的日志文件,提示如下的错误
# 查看日志 $ sudo docker-compose logs -f
配置反向代理
这个时候需要我们配置https加密访问。为了一步到位,我准备使用反向代理,把9008端口的访问转发到80端口上,再使用301跳转强制https访问
# 进入lnmp的网站配置文件目录,备份原配置文件 $ cd /usr/local/nginx/conf/vhost $ cp webssh.yourdomain.com.conf webssh.yourdomain.com.con.bak # 修改配置文件 $ vi webssh.yourdomain.com.conf
将以下一段代码写入配置文件中(网站需提前开启https访问)
location ^~ /
{
proxy_pass http://127.0.0.1:9008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
add_header X-Cache $upstream_cache_status;
}这时候,再访问你的域名http://yourdomain.com,就会出现webssh的页面,也不用带9008端口这个尾巴了,而且直接跳转到了https
但是,好像,这样有问题。为什么?因为这样所有人都可以访问这个页面,意味着谁都可以用你的webssh,一来你的服务器暴露在公网上会被入侵,更重要的是坏人肯定会拿你的webssh做跳板搞入侵干坏事,要是这样你就麻烦了。所以,必须给webssh上一道锁,也就是设置用户名和密码访问
设置用户名和密码访问
# 安装密码生成工具 $ sudo yum install httpd -y # 生成用户和密码文件 $ sudo htpasswd -c /usr/local/nginx/password username ## 其中username是用户名,自己可以随便命名 ## 回车后根据提示连续输入两次密码 # 删除指定的用户 $ htpasswd -D /usr/local/nginx/password username #修改用户名和密码 $ htpasswd -D /usr/local/nginx/password username $ htpasswd -b /usr/local/nginx/password username pass ## -D 删除指定的用户 ## -b htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码 ## -p htpassswd命令不对密码进行进行加密,即明文密码
修改Nginx配置文件
# 进入lnmp的nignx配置文件夹,修改相应的配置文件yourdomain.com.conf $ cd /usr/local/nginx/conf/vhost $ vi yourdomain.com.conf
在配置文件中的server加上认证配置,加入auth_basic和auth_basic_user_file两个项目。这里需要注意,如果你的网站是开启了https的,这两个项目需要加到https的配置中,也就是第二个server中。
server {
listen 80;
server_name localhost;
# ...
auth_basic "请输入用户和密码"; # 验证时的提示信息
auth_basic_user_file /usr/local/nginx/password; # 认证文件
location / {
root /var/www;
index index.html index.htm;
}
# ...
}# 配置文件修改完成后,重新启动nginx $ sudo service nginx restart
访问刚才的页面,就会弹出对话框,要求进行认证。输入正确的用户名和密码,就可以进入,放心地使用了
贴一个我自己服务器上的配置文件
server
{
listen 80;
#listen [::]:80;
server_name yourdomain.com ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/yourdomain.com;
#include rewrite/other.conf;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php-pathinfo.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
location / {
return 301 https://$host$request_uri;
}
access_log /home/wwwlogs/yourdomain.com.log;
}
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name yourdomain.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/yourdomain.com;
auth_basic "请输入用户和密码";
auth_basic_user_file /usr/local/nginx/password;
ssl_certificate /usr/local/nginx/conf/ssl/yourdomain.com/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/yourdomain.com/yourdomain.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
location ^~ /
{
proxy_pass http://127.0.0.1:9008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300;
proxy_http_version 1.1;
# proxy_hide_header Upgrade;
add_header X-Cache $upstream_cache_status;
}
include rewrite/other.conf;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php-pathinfo.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/yourdomain.com.log;
}最后,贴一个登陆进去以后的效果图,简洁朴素大方,使用起来很有感觉。虽然sshwifty似乎功能更多,界面也更好看一些,但它配置起来也更麻烦,还不如这个简单的webssh来的实在。



