مقدمه
معمولاً برای اتصال به یک سرور SSH از یک ابزار خط فرمان در ترمینال یا نرمافزار شبیهساز ترمینال که شامل یک کلاینت SSH است استفاده میشود. برخی ابزارها، مانند WebSSH در پایتون، امکان اتصال از طریق SSH و اجرای یک ترمینال را مستقیماً در مرورگر وب فراهم میکنند.
این قابلیت در شرایط مختلف مفید است. بهویژه در ارائههای زنده یا دموها که اشتراکگذاری یک پنجره ترمینال معمولی بهگونهای که بهدرستی قابل درک باشد دشوار است، این روش بسیار کمککننده است. همچنین در محیطهای آموزشی زمانی که دسترسی به افرادی که با خط فرمان آشنایی ندارند فراهم میشود، این روش مفید است زیرا نیازی به نصب نرمافزار بر روی دستگاههای آنها ندارد (خصوصاً در ویندوز که گزینههای پیشفرض همراه با مشکلاتی هستند). در نهایت، WebSSH پایتون بهویژه بسیار قابل حمل است و بهجز پایتون هیچ وابستگی دیگری برای راهاندازی نیاز ندارد. سایر پشتههای ترمینال مبتنی بر وب میتوانند پیچیدهتر و خاص به لینوکس باشند.
در این آموزش، شما WebSSH را راهاندازی کرده و از طریق SSH در مرورگر خود به آن متصل خواهید شد. سپس بهطور اختیاری آن را با یک گواهینامه SSL ایمن کرده و آن را پشت یک پراکسی معکوس Nginx برای استقرار در محیط تولید قرار خواهید داد.
پیشنیازها
- یک محیط ویندوز، مک یا لینوکس با سرویس SSH در حال اجرا. مفید است که WebSSH را به صورت محلی اجرا کنید، اما اگر سرویس SSH در دستگاه محلی خود ندارید، میتوانید از یک سرور لینوکس از راه دور استفاده کنید.
- زبان برنامهنویسی پایتون نصب شده همراه با pip، مدیر بسته آن. برای نصب پایتون و pip در اوبونتو میتوانید به بخش اول این آموزش مراجعه کنید.
- بهطور اختیاری، برای فعالسازی HTTPS در مرورگر، به گواهینامههای SSL و نام دامنه خود نیاز دارید. میتوانید آنها را با استفاده از Certbot در حالت مستقل دریافت کنید.
گام 1 – نصب WebSSH
اگر پایتون و pip را نصب کردهاید، باید بتوانید بستههای پایتون را از PyPI (مخزن نرمافزار پایتون) نصب کنید. WebSSH به گونهای طراحی شده که مستقیماً از خط فرمان نصب و اجرا شود، بنابراین نیازی به تنظیم محیط مجازی دیگر مانند آنچه در آموزش نصب پایتون 3 بحث شده، ندارید. محیطهای مجازی بیشتر زمانی مفید هستند که در حال کار بر روی پروژههای خود باشید، نه زمانی که ابزارهای سیستمی را نصب میکنید.
برای نصب بسته WebSSH از دستور زیر استفاده کنید:
sudo pip3 install webssh
خروجی باید بهصورت زیر باشد:
Output
…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0
با استفاده از sudo، دستور wssh بهطور جهانی نصب میشود. میتوانید با استفاده از دستور which بررسی کنید که wssh در کجا نصب شده است:
which wssh
خروجی باید چیزی شبیه به این باشد:
/usr/local/bin/wssh
اکنون WebSSH را نصب کرده اید. در مرحله بعد اجرا می کنید و به آن متصل می شوید. با این حال، ابتدا باید یک قانون فایروال اضافه کنید. WebSSH به طور پیش فرض روی پورت 8888 اجرا می شود. اگر از ufw به عنوان فایروال استفاده می کنید، اجازه دهید آن پورت از طریق ufw عبور کند:
sudo ufw allow 8888
گام 2 – اجرای WebSSH و اتصال به آن
اگر WebSSH را بر روی یک دستگاه محلی اجرا میکنید، میتوانید بدون نیاز به آرگومانهای اضافی، دستور wssh را اجرا کنید. اگر WebSSH را بر روی یک سرور از راه دور اجرا میکنید، باید از گزینه --fbidhttp=False
برای اجازه دادن به اتصالات از راه دور از طریق HTTP استفاده کنید. این اتصال در صورتی که از یک شبکه محافظتنشده استفاده کنید، ایمن نیست، اما برای یک دمو مفید است و در مراحل بعدی، WebSSH را ایمن خواهید کرد.
wssh --fbidhttp=False
حالا میتوانید به WebSSH متصل شوید و وارد شوید. به آدرس your_domain:8888
در مرورگر وب خود بروید (اگر به صورت محلی اجرا میکنید، از localhost:8888
استفاده کنید). صفحه ورود WebSSH باید نمایش داده شود.
اطلاعات SSH معمولی خود را وارد کنید. اگر طبق راهنمای راهاندازی اولیه سرور DigitalOcean عمل کردهاید، باید از احراز هویت مبتنی بر کلید استفاده کنید، نه رمز عبور. بنابراین، فقط باید نام میزبان سرور، نام کاربری خود و کلید SSH را مشخص کنید که باید در پوشه .ssh/
در دایرکتوری خانگی شما قرار داشته باشد (معمولاً نام آن id_rsa
است).
توجه: همانطور که ممکن است از تعیین دستی نام میزبان حدس بزنید، WebSSH همچنین می تواند برای اتصال به سرورهایی غیر از سروری که روی آن اجرا می شود استفاده شود. برای این آموزش، روی همان سروری که شما به آن متصل هستید اجرا می شود.
برای اتصال، روی دکمه Connect کلیک کنید و باید صفحه خوشآمدگویی ترمینال پیشفرض خود را مشاهده کنید.
در این مرحله، می توانید از ترمینال خود به طور معمول استفاده کنید، گویی از طریق SSH متصل شده اید. چندین کاربر همچنین می توانند از طریق یک نمونه WebSSH به طور همزمان متصل شوند. اگر WebSSH را روی یک ماشین محلی فقط برای پخش جریانی یا ضبط ویدیو دارید، ممکن است به این نیاز داشته باشید. میتوانید Ctrl+C را در پایانهای که WebSSH را از آن راهاندازی کردهاید (نه پایانه WebSSH) وارد کنید تا پس از اتمام سرور WebSSH متوقف شود.
اگر روی یک سرور راه دور اجرا می کنید، نمی خواهید از WebSSH در تولید پشت یک اتصال HTTP ناامن استفاده کنید. اگرچه هنوز هم توسط مکانیزم احراز هویت سرویس SSH محافظت میشوید، استفاده از اتصال SSH از طریق HTTP خطر امنیتی قابلتوجهی دارد و احتمالاً به دیگران اجازه میدهد تا اعتبارنامه SSH شما را بدزدند. در مراحل بعدی، نمونه WebSSH خود را ایمن خواهید کرد تا کمتر از یک اتصال SSH معمولی ایمن نباشد.
گام 3 – (اختیاری) ایمنسازی WebSSH با گواهینامه SSL
برای تکمیل این مرحله، باید قبلاً دامنه و گواهینامههای SSL خود را دریافت کرده باشید. یکی از راهها استفاده از Certbot در حالت مستقل است.
بعد از دریافت گواهینامهها، بررسی کنید که آنها در مسیر زیر قرار دارند:
sudo ls /etc/letsencrypt/live/your_domain
برای اجرای WebSSH با پشتیبانی از HTTPS، باید مسیر گواهینامه و کلید را به آن ارائه دهید:
sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem'
در مرورگر وب خود به آدرس https://your_domain:4433
بروید و باید همان رابط کاربری را ببینید که در مرحله قبلی مشاهده کردید، حالا با پشتیبانی از HTTPS.
گام 4 – (اختیاری) اجرای WebSSH پشت پراکسی معکوس Nginx
با قرار دادن یک وبسرور مانند Nginx در جلوی برنامههای وب، میتوانید عملکرد را بهبود بخشید و امنیت سایت را سادهتر کنید. شما Nginx را نصب کرده و آن را برای پراکسی معکوس درخواستها به WebSSH پیکربندی خواهید کرد.
اول، فهرست بستههای خود را بهروزرسانی کنید، سپس Nginx را نصب کنید:
sudo apt update nginx
sudo apt install nginx
اگر از فایروال ufw استفاده میکنید، باید پیکربندی آن را تغییر دهید تا دسترسی به پورتهای پیشفرض HTTP/HTTPS (پورتهای 80 و 443) فراهم شود:
sudo ufw allow “Nginx Full”
سپس فایل پیکربندی Nginx را در مسیر /etc/nginx/sites-available/webssh
ایجاد کنید:
sudo nano /etc/nginx/sites-available/webssh
پیکربندی را مشابه زیر وارد کنید:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
listen 443 ssl;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
شما می توانید این پیکربندی را به عنوان داشتن سه “بلوک” اصلی برای آن بخوانید. بلوک اول، قبل از مکان / خط، شامل یک پیکربندی Nginx برای ارائه یک وب سایت در پورت HTTP پیش فرض، 80 است. مکان / بلوک حاوی پیکربندی برای پروکسی اتصالات ورودی به WebSSH است که در پورت 8888 به صورت داخلی اجرا می شود، در حالی که حفظ می شود. SSL. پیکربندی در انتهای فایل، پس از مکان / بلوک، جفتهای کلید SSL LetsEncrypt شما را بارگیری میکند و اتصالات HTTP را به HTTPS هدایت میکند.
فایل را ذخیره کرده و ببندید. اگر از nano استفاده می کنید، Ctrl+X را فشار دهید، سپس وقتی از شما خواسته شد، Y و سپس Enter را فشار دهید.
در مرحله بعد، باید این پیکربندی جدید را فعال کنید. قرارداد Nginx ایجاد پیوندهای نمادین (مانند میانبرها) از فایلهای موجود در سایتها/به پوشه دیگری به نام sites-enabled/هنگامی که تصمیم به فعال یا غیرفعال کردن آنها دارید، است. با استفاده از مسیرهای کامل برای وضوح، این پیوند را ایجاد کنید:
sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh
بهطور پیشفرض، Nginx شامل فایل پیکربندی دیگری در /etc/nginx/sites-available/default است که به /etc/nginx/sites-enabled/default پیوند داده شده است، که صفحه فهرست پیشفرض خود را نیز ارائه میکند. میخواهید آن قانون را با حذف آن از /sites-enabled غیرفعال کنید، زیرا با پیکربندی جدید WebSSH شما در تضاد است:
sudo rm /etc/nginx/sites-enabled/default
توجه: پیکربندی Nginx در این آموزش برای ارائه یک برنامه واحد، WebSSH، طراحی شده است. شما می توانید این پیکربندی Nginx را برای ارائه چندین برنامه در یک سرور با دنبال کردن اسناد Nginx گسترش دهید.
سپس، پیکربندی Nginx را آزمایش کنید:
sudo nginx -t
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
و سرویس Nginx را مجدداً راهاندازی کنید:
sudo systemctl restart nginx
در نهایت، میتوانید قوانین فایروال را که قبلاً برای دسترسی مستقیم به WebSSH ایجاد کردهاید حذف کنید، زیرا تمام ترافیک اکنون توسط Nginx از طریق پورتهای استاندارد HTTP/HTTPS مدیریت میشود:
sudo ufw delete allow 8888
sudo ufw delete allow 4433
این بار نیازی به ارائه گواهینامه و مسیرهای کلیدی ندارید، زیرا Nginx آن را مدیریت می کند. سپس در یک مرورگر وب به your_domain بروید.
توجه داشته باشید که WebSSH اکنون از طریق HTTPS از طریق Nginx بدون نیاز به تعیین پورت ارائه می شود. در این مرحله، شما همه چیز را بهجز راهاندازی خود wssh خودکار کردهاید. در مرحله آخر این کار را انجام خواهید داد.
گام 5 – (اختیاری) ایجاد یک سرویس Systemd برای WebSSH
استقرار برنامههای سمت سرور که بهطور خودکار در پسزمینه اجرا نمیشوند، در ابتدا میتواند غیرواقعی باشد، زیرا هر بار باید آنها را مستقیماً از خط فرمان شروع کنید. راه حل این است که سرویس پس زمینه خود را راه اندازی کنید.
برای انجام این کار، یک فایل واحد ایجاد می کنید که می تواند توسط سیستم init سرور شما استفاده شود. تقریباً در تمام توزیعهای لینوکس مدرن، سیستم init Systemd نامیده میشود و میتوانید با استفاده از دستور systemctl با آن تعامل داشته باشید.
اگر WebSSH هنوز در ترمینال شما در حال اجرا است، Ctrl+C را فشار دهید تا متوقف شود. سپس با استفاده از nano یا ویرایشگر متن مورد علاقه خود، یک فایل جدید به نام /etc/systemd/system/webssh.service را باز کنید:
sudo nano /etc/systemd/system/webssh.service
فایل واحد شما حداقل به یک بخش [Unit]، یک بخش [Service] و یک بخش [Install] نیاز دارد:
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
این فایل را می توان به صورت زیر تقسیم کرد:
- بخش [واحد] حاوی توضیحات متنی ساده از سرویس جدید شما و همچنین یک قلاب After است که مشخص میکند چه زمانی باید در هنگام راهاندازی سیستم اجرا شود، در این مورد پس از اینکه رابطهای شبکه سرور شما بالا آمدند.
- بخش [Service] مشخص می کند که کدام دستور باید اجرا شود و همچنین کدام کاربر باید آن را اجرا کند. در این حالت، www-data کاربر پیشفرض Nginx در سرور اوبونتو است و wssh خود فرمان است.
- بخش [نصب] فقط حاوی خط WantedBy=multi-user.target است که همراه با خط After در بخش [واحد] کار می کند تا اطمینان حاصل شود که سرویس زمانی که سرور آماده پذیرش ورود کاربر است شروع می شود.
پس از ذخیره فایل، سرویس را شروع کرده و آن را برای اجرا در زمان راهاندازی سیستم فعال کنید:
sudo systemctl start webssh
sudo systemctl enable webssh
از systemctl status webssh برای تأیید اینکه با موفقیت شروع شده است استفاده کنید. شما باید خروجی مشابه زمانی که فرمان را برای اولین بار در ترمینال اجرا کردید دریافت کنید.
sudo systemctl status webssh
Output
● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)
اکنون می توانید https://your_domain را در مرورگر خود بارگیری مجدد کنید و باید یک بار دیگر رابط WebSSH را دریافت کنید. از این پس WebSSH و Nginx به طور خودکار با سرور شما راه اندازی مجدد می شوند و در پس زمینه اجرا می شوند.
نتیجه
در این آموزش، WebSSH را نصب کرده و یک راهحل قابل حمل برای ارائه یک رابط خط فرمان در مرورگر وب فراهم کردید. سپس با افزودن SSL، پراکسی معکوس Nginx و ایجاد سرویس سیستمدی، استقرار آن را بهبود بخشیدید. این مدل برای استقرار برنامههای کوچک سمت سرور بهویژه در زمینه امنیت SSH که از جفت کلید برای احراز هویت استفاده میکند، بسیار مفید است.