server



MySQL یک سیستم مدیریت پایگاه داده منبع باز است که معمولاً به عنوان بخشی از پشته محبوب LAMP (Linux ، Apache ، MySQL ، PHP / Python / Perl) نصب می شود. این سیستم یک مدل رابطه ای را پیاده سازی می کند و برای مدیریت داده های خود از زبان پرس و جوی ساختاریافته (معروف به SQL) استفاده می کند.
در این آموزش نحوه نصب MySQL نسخه 8 بر روی سرور مجازی Ubuntu 20.04 بررسی می شود. با تکمیل آن ، شما یک پایگاه داده رابطه ای در حال کار خواهید داشت که می توانید برای ساختن وب سایت یا برنامه بعدی خود استفاده کنید.

پیش نیازها
برای دنبال کردن این آموزش ، به موارد زیر نیاز دارید:
• یک سرور مجازی Ubuntu 20.04 با یک کاربر ادمین غیر ریشه و فایروال تنظیم شده با UFW . برای راه اندازی ، راهنمای ستاپ اولیه سرور مجازی برای اوبونتو 20.04 را دنبال کنید.

مرحله 1 – نصب MySQL
در Ubuntu 20.04 می توانید MySQL را با استفاده از مخزن بسته APT نصب کنید. در زمان نوشتن این مقاله، نسخه MySQL موجود در مخزن پیش فرض اوبونتو نسخه 8.0.19 است.
برای نصب آن ، اگر اخیراً این کار را نکرده اید ، فهرست بسته را روی سرور مجازی خود به روز کنید:
$ sudo apt update

سپس بسته mysql-server را نصب کنید:
$ sudo apt install mysql-server

این کار MySQL را نصب می کند ، اما از شما نمیخواهد که رمز عبوری تنظیم کنید یا تغییرات دیگری در پیکربندی ایجاد کنید. از آنجا که این امر باعث می شود نصب MySQL ناامن باشد ، در ادامه به این موضوع خواهیم پرداخت.

مرحله 2 – پیکربندی MySQL
برای نصب های جدید MySQL ، بهتر است اسکریپت امنیتی شامل DBMS را اجرا کنید. این اسکریپت برخی از گزینه های پیش فرض با ایمنی کمتر را برای مواردی مانند ورود به سیستم ریشه از راه دور و کاربران نمونه تغییر می دهد.
اسکریپت امنیتی را با sudo اجرا کنید:
$ sudo mysql_secure_installation

این امر مجموعه ای از اعلان ها را به شما نمایش میدهد که بتوانید برخی از گزینه های امنیتی نصب MySQL خود را تغییر دهید. اولین سؤال از شما میپرسد که آیا می خواهید افزونه Validate Password را تنظیم کنید ، که می تواند برای تست قدرت رمز ورود MySQL استفاده شود.
اگر تصمیم به تنظیم افزونه اعتبار سنجی گذرواژه بگیرید ، اسکریپت از شما می خواهد که یک سطح اعتبار رمز عبور را انتخاب کنید. قوی ترین سطح – که شما با وارد کردن 2 انتخاب می کنید – به حداقل 8 کاراکتر نیاز دارد و شامل ترکیبی از حروف بزرگ ، حروف کوچک ، عدد و علائم خاص است:
Output
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2

صرف نظر از این که آیا می خواهید افزونه رمز عبور معتبر را انتخاب کنید ، اعلان بعدی تعیین رمز عبور برای کاربر ریشه MySQL خواهد بود. Enter را بزنید و رمز عبور ایمن را تایید کنید:
Output
Please set the password for root here.

New password:

Re-enter new password:

اگر از افزونه اعتبار سنجی گذرواژه استفاده کرده اید ، در مورد قدرت رمزعبور جدید خود بازخورد دریافت خواهید کرد. سپس اسکریپت از شما سؤال می کند که آیا می خواهید رمز عبوری را که وارد کرده اید ادامه دهید یا می خواهید یک رمز جدید را وارد کنید. با فرض اینکه از قدرت رمز عبوری که تازه وارد کرده اید راضی هستید ، Y را برای ادامه اسکریپت وارد کنید:
Output
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

از اینجا به بعد ، می توانید Y و سپس ENTER را فشار دهید تا پیش فرض برای همه سؤالات بعدی را بپذیرید. با این کار برخی از کاربران ناشناس و بانک اطلاعاتی تستی حذف می شوند ، ورود به سیستم ریشه از راه دور غیرفعال می شود و این قوانین جدید را بارگذاری می کند تا MySQL فوراً با تغییراتی که ایجاد کرده اید منطبق شود.
توجه داشته باشید که حتی اگر یک رمز عبور برای کاربر ریشه MySQL تنظیم کرده اید ، این کاربر برای تأیید اعتبار با گذرواژه هنگام اتصال به پوسته MySQL پیکربندی نشده است. در صورت تمایل می توانید با دنبال کردن مرحله 3 این تنظیمات را اعمال کنید.

مرحله 3 – تنظیم تأیید اعتبار و امتیازات کاربر (اختیاری)
در سیستم های اوبونتو که MySQL 5.7 را اجرا می کند (و نسخه های بعدی) ، کاربر ریشه MySQL برای تأیید اعتبار با استفاده از افزونه auth_socket بصورت پیش فرض و نه با گذرواژه تنظیم شده است. این امر امنیت و قابلیت استفاده بیشتر را در بسیاری از موارد امکان پذیر می کند ، اما همچنین می تواند مواردی را پیچیده تر کند که شما نیاز به دسترسی به کاربر توسط یک برنامه خارجی (مانند phpMyAdmin) دارید.
به منظور استفاده از رمز عبور برای اتصال به MySQL به عنوان root ، باید روش تأیید اعتبار آن را از auth_socket به افزونه دیگری مانند caching_sha2_password یا mysql_native_password تغییر دهید. برای این کار ، اعلان MySQL را از پایانه خود باز کنید:
$ sudo mysql

سپس ، با دستور زیر بررسی کنید که هر یک از حسابهای کاربری MySQL شما از کدام روش تأیید اعتبار استفاده میکند:
Mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

Output
+——————+————————————————————————+———————–+———–+
| user | authentication_string | plugin | host |
+——————+————————————————————————+———————–+———–+
| debian-sys-maint | $A$005$lS|M#3K #XslZ.xXUq.crEqTjMvhgOIX7B/zki5DeLA3JB9nh0KwENtwQ4 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| root | | auth_socket | localhost |
+——————+————————————————————————+———————–+———–+
5 rows in set (0.00 sec)

در این مثال ، می بینید که کاربر ریشه با استفاده از افزونه auth_socket ، در واقع تأیید اعتبار می کند. برای پیکربندی حساب ریشه برای تأیید اعتبار با رمز عبور ، عبارت ALTER USER را اجرا کنید تا افزونه احراز هویت مورد استفاده خود را تغییر داده و یک رمز عبور جدید تنظیم کنید.
مطمئن شوید که رمز عبور را به رمز عبور قوی به انتخاب خود تغییر می دهید و آگاه باشید که این دستور رمز ریشه را که در مرحله 2 تنظیم کرده اید تغییر می دهد:
Mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH caching_sha2_password BY ‘password’;

توجه: جمله قبلی ALTER USER کاربر ریشه MySQL را برای تأیید اعتبار با افزونه caching_sha2_password تنظیم می کند. طبق مطالب رسمی MySQL ، caching_sha2_password افزونه ارجح تأیید هویت MySQL است ، زیرا رمزگذاری ایمن تر پسورد را نسبت به نسخه قدیمی تر به همراه دارد ، اما هنوز هم به طور گسترده استفاده می شود ، mysql_native_password.
با این حال ، بسیاری از برنامه های PHP برای مثال phpMyAdmin – با اطمینان با caching_sha2_password کار نمی کنند. اگر قصد استفاده از این پایگاه داده را با برنامه PHP دارید ، بهتر است تأیید اعتبار ریشه را با mysql_native_password انجام دهید:
Mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

سپس ، PRUSILEGES FLUSH را اجرا کنید که به سرور مجازی می گوید جداول اعطای امتیاز را مجدد لود کرده و
تغییرات جدید را اعمال کند:
Mysql> FLUSH PRIVILEGES;

روش های تأیید اعتبار استفاده شده توسط هر یک از کاربران خود را دوباره بررسی کنید تا تأیید کنید که ریشه دیگر با استفاده از افزونه auth_socket احراز هویت نمی کند:
Mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

Output
+——————+————————————————————————+———————–+———–+
| user | authentication_string | plugin | host |
+——————+————————————————————————+———————–+———–+
| debian-sys-maint | $A$005$lS|M#3K #XslZ.xXUq.crEqTjMvhgOIX7B/zki5DeLA3JB9nh0KwENtwQ4 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | caching_sha2_password | localhost |
+——————+————————————————————————+———————–+———–+
5 rows in set (0.00 sec)

در این مثال می توانید مشاهده کنید که کاربر ریشه MySQL اکنون با استفاده از caching_sha2_password تأیید اعتبار می کند. پس از تأیید این موضوع روی سرور مجازی خود ، می توانید از پوسته MySQL خارج شوید:
Mysql> exit

از طرف دیگر ، به نظر برخی ممکن است اتصال به MySQL با یک کاربر اختصاصی برای گردش کارشان مناسب تر باشد. برای ایجاد چنین کاربری ، بار دیگر پوسته MySQL را باز کنید:
$ sudo mysql

توجه: اگر احراز هویت رمز عبور را برای ریشه فعال کرده اید ، همانطور که در پاراگراف های قبلی توضیح داده شد ، برای دسترسی به پوسته MySQL باید از دستور دیگری استفاده کنید. موارد زیر کلاینت MySQL شما را با حق امتیاز کاربر به طور منظم اجرا می کند و شما فقط با تأیید اعتبار ، امتیازات ادمین را در بانک اطلاعات دریافت خواهید کرد:
$ mysql -u root -p

از آنجا ، یک کاربر جدید ایجاد کرده و یک رمزعبور قوی به آن بدهید:
Mysql> CREATE USER ‘sammy’@’localhost’ IDENTIFIED BY ‘password’;

سپس امتیازات مناسب را به کاربر جدید خود اعطا کنید. به عنوان مثال ، شما می توانید امتیازات کاربر را به تمام جداول موجود در دیتابیس و همچنین قدرت اضافه کردن ، تغییر و حذف امتیازهای کاربر با این دستور اعطا کنید:
Mysql> GRANT ALL PRIVILEGES ON *.* TO ‘sammy’@’localhost’ WITH GRANT OPTION;

توجه داشته باشید که در این مرحله ، دیگر نیازی به اجرای فرمان FLUSH PRIVILEGES ندارید. این دستور فقط در صورت تغییر جدول های اعطای امتیاز با استفاده از عباراتی مانند INSERT ، UPDATE یا DELETE مورد نیاز است. از آنجا که شما به جای تغییر یک کاربر موجود، کاربر جدیدی ایجاد کرده اید،FLUSH PRIVILEGES در اینجا غیر ضروری است.
سپس ، از پوسته MySQL خارج شوید:
Mysql> exit

در آخر ، بیایید نصب MySQL را آزمایش کنیم.
مرحله 4 – تست MySQL
صرف نظر از نحوه نصب آن ، MySQL باید به صورت خودکار شروع به کار کند. برای آزمایش این موضوع ، وضعیت آن را بررسی کنید.
$ systemctl status mysql.service

خروجی مشابه زیر را مشاهده خواهید کرد:
Output
● mysql.service – MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: Server is operational”
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /usr/sbin/mysqld

اگر MySQL در حال اجرا نیست ، می توانید آن را با sudo systemctl start mysql شروع کنید.
برای بررسی بیشتر، می توانید با استفاده از ابزار mysqladmin ، که یک کلاینت است و به شما امکان اجرای دستورات ادمین را می دهد ، به پایگاه داده وصل شوید. به عنوان مثال ، این دستور می گوید به عنوان ریشه به MySQL متصل شده (-u root) ، اعلان گذرواژه (-p) را پر کرده و نسخه را برگردانید.
$ sudo mysqladmin -p -u root version

باید خروجی مشابه این را ببینید:
Output
mysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version 8.0.19-0ubuntu5
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 10 min 44 sec

Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per second avg: 0.038

این بدان معنی است که MySQL در حال کار است.
نتیجه
اکنون یک ستاپ اولیه MySQL نصب شده در سرور مجازی خود دارید. در اینجا چند نمونه از مراحل بعدی که می توانید انجام دهید آورده شده است:
• یک پشته LAMP تنظیم کنید
• پرس و جوهای در حال اجرا را با SQL تمرین کنید

 

برچسب‌ها:


پایتون یک زبان برنامه نویسی انعطاف پذیر و همه کاره است که می تواند در بسیاری از موارد به خاطر داشتن نقاط قوت در اسکریپت ، اتوماسیون ، تجزیه و تحلیل داده ها ، یادگیری ماشین و توسعه back-end مورد استفاده قرار گیرد. تیم توسعه پایتون برای اولین بار در سال 1991 با نامی الهام گرفته از گروه طنز بریتانیایی مونتی پایتون، آن را منتشر کردند و میخواستند پایتون را به زبانی تبدیل کنند که استفاده از آن بسیار جالب باشد. ستاپ سریع و سبک نسبتاً ساده و بازخورد فوری در مورد خطاها، پایتون را به یک انتخاب عالی برای مبتدیان و توسعه دهندگان با تجربه تبدیل کرده است. پایتون 3 جدیدترین نسخه این زبان است و آینده پایتون به حساب می آید.
در این آموزش سرور مجازی Ubuntu .04 شما با یک محیط برنامه نویسی Python 3 تنظیم می شود. برنامه نویسی روی سرور مجازی مزایای بسیاری دارد و از همکاری در پروژه های توسعه پشتیبانی می کند. اصول کلی این آموزش در مورد هرگونه توزیع Debian Linux کاربرد دارد.
پیش نیازها
برای تکمیل این آموزش ، شما باید یک کاربر غیر ریشه با امتیازات sudo در سرور مجازی Ubuntu .04 داشته باشید. برای یادگیری چگونگی دستیابی به این تنظیمات ، راهنمای ستاپ اولیه دستی سرور مجازی را دنبال کنید یا اسکریپت خودکار ما را اجرا کنید.
اگر قبلاً با محیط ترمینال آشنایی ندارید ، می توانید مقاله مقدمه ای بر ترمینال لینوکس” را برای جهت گیری بهتر در مورد ترمینال مطالعه کنید.
با راه اندازی سرور مجازی و کاربر ، آماده شروع کار هستید.
مرحله 1 – تنظیم پایتون 3
اوبونتو .04 و سایر نسخه های دبیان لینوکس ، Python 3 و Python 2 را از قبل نصب شده دارد. برای اطمینان از به روز بودن نسخه های خود ، بیایید سیستم را با دستور APT به روز رسانی کنیم تا با ابزار بسته بندی پیشرفته اوبونتو همکاری کند:
$ sudo apt update

$ sudo apt -y upgrade

پرچم -y تأیید خواهد کرد که ما با نصب همه موارد موافق هستیم ، اما بسته به نسخه لینوکس شما ، ممکن است لازم باشد که با به روزرسانی و ارتقای سیستم ، پیام های بیشتری را تأیید کنید.
پس از اتمام روند ، می توانیم با تایپ کردن دستور زیر نسخه پایتون 3 که در سیستم نصب شده است را بررسی کنیم:
$ python3 -V

در پنجره ترمینال خروجی دریافت خواهید کرد که شماره نسخه را به شما اطلاع می دهد. در حالی که ممکن است تعداد متفاوت باشد ، خروجی مشابه این خواهد بود:
Output
Python 3.6.7

برای مدیریت بسته های نرم افزاری برای پایتون ، بیایید pip را نصب کنیم ، ابزاری که بسته های برنامه نویسی را که ممکن است بخواهیم در پروژه های توسعه خود استفاده کنیم ، نصب و مدیریت خواهد کرد. می توانید با خواندن چگونگی وارد کردن ماژول ها در پایتون 3” در مورد ماژول ها یا بسته هایی که می توانید با pip نصب کنید اطلاعات کسب کنید.
$ sudo apt install -y python3-pip

بسته های پایتون با تایپ این دستور قابل نصب هستند:
$ pip3 install package_name

در اینجا ، pack_name می تواند به هر بسته یا کتابخانه Python مانند Django برای توسعه وب یا NumPy برای محاسبات علمی اشاره کند. بنابراین اگر می خواهید NumPy را نصب کنید ، می توانید با دستور pip3 install numpy این کار را انجام دهید.
چند بسته و ابزار توسعه دیگر وجود دارد که باید اطمینان حاصل شود که یک مجموعه قوی برای محیط برنامه نویسی خود داریم:
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev

پس از راه اندازی پایتون و نصب pip و سایر ابزارها ، می توانیم یک محیط مجازی برای پروژه های توسعه خود تنظیم کنیم.
مرحله 2 – تنظیم یک محیط مجازی
محیط های مجازی شما را قادر می سازد برای پروژه های پایتون فضایی مجزا در سرور مجازی خود داشته باشید ، اطمینان حاصل کنید که هر یک از پروژه های شما می توانند مجموعه ای از متعلقات خاص خود را داشته باشند که هیچ یک از پروژه های دیگر شما را مختل نمی کند.
تنظیم یک محیط برنامه نویسی ، کنترل بیشتری بر روی پروژه های Python و نحوه دستیابی به نسخه های مختلف بسته ها برای ما فراهم می کند. این امر به ویژه هنگام کار با بسته های شخص ثالث بسیار مهم است.
می توانید همانطور که می خواهید محیط برنامه نویسی Python را تنظیم کنید. هر محیط در واقع یک فهرست یا پوشه ای در سرور مجازی شماست که چندین اسکریپت در آن وجود دارد تا بتواند به عنوان یک محیط عمل کند.
در حالی که چند روش برای دستیابی به یک محیط برنامه نویسی در پایتون وجود دارد ، ما در اینجا از ماژول venv استفاده می کنیم که بخشی از کتابخانه استاندارد Python 3 است. بگذارید venv را با تایپ کردن دستور زیر نصب کنیم:
$ sudo apt install -y python3-venv

با استفاده از این نصب ، آماده ایجاد محیط هستیم. باید یا انتخاب کنیم که می خواهیم محیط های برنامه نویسی پایتون را در کدام دیرکتوری قرار دهیم ، یا یک دیرکتوری جدید با mkdir ایجاد کنیم ، مانند:
$ kdir environments

$ cd environments
وقتی در دایرکتوری قرار گرفتید که میخواهید محیط در آن جا باشد ، می توانید با اجرای دستور زیر محیطی ایجاد کنید:
$ python3.6 -m venv my_env

در اصل ، pyvenv یک دیرکتوری جدید ایجاد می کند که شامل چند آیتم است که می توانیم با دستور ls آنها را مشاهده کنیم:
$ ls my_env

Output
bin include lib lib64 pyvenv.cfg share

این فایلها با هم کار می کنند تا اطمینان حاصل کنند که پروژه های شما از بستر وسیع دستگاه محلی شما جدا شده اند ، به گونه ای که فایل های سیستم و فایل های پروژه مخلوط نشوند. این روش خوبی برای کنترل نسخه و اطمینان از دسترسی هر یک از پروژه های شما به بسته های خاص مورد نیاز خود است. Python Wheels یک فرمت بسته ساخته شده برای Python است که می تواند با کاهش تعداد دفعات لازم برای کامپایل ، باعث افزایش سرعت تولید نرم افزار شود ، و در دیرکتوری share اوبونتو .04 قرار خواهد گرفت.
برای استفاده از این محیط ، باید آن را فعال کنید ، که می توانید با تایپ دستور زیر که اسکریپت activate  را فراخوانی می کند به آن دست پیدا کنید.
$ source my_env/bin/activate

خط فرمان شما اکنون با نام محیط شما پیشوند داده می شود ، در این حالت my_env نام دارد. بسته به اینکه کدام نسخه لینوکس را اجرا میکنید، پیشوند شما ممکن است متفاوت باشد ، اما نام محیط شما در پرانتز باید اولین چیزی باشد که در خط python مشاهده می کنید:
(my_env) Sammy@ubuntu:~/environments$
این پیشوند به ما اطلاع می دهد که محیط my_env در حال حاضر فعال است ، به این معنی که وقتی ما در اینجا برنامه هایی را ایجاد می کنیم آنها فقط از تنظیمات و بسته های خاص این محیط استفاده می کنند.
توجه: در محیط مجازی می توانید به جای python3 از فرمان python استفاده کنید و در صورت تمایل به جای pip3 از pip استفاده کنید. اگر در خارج از محیط خود از پایتون 3 در دستگاه خود استفاده می کنید ، لازم است که از دستورات python3 و pip3 استفاده کنید.

بعد از طی کردن این مراحل ، محیط مجازی شما آماده استفاده است.
مرحله 3 – ایجاد یک برنامه ” hello, world ”
اکنون که محیط مجازی ما تنظیم شده است ، بیایید یک برنامه ” hello, world معمولی ایجاد کنیم. این امر به ما امکان می دهد تا محیط خود را مورد آزمایش قرار دهیم و این امکان را برای ما فراهم می کند که اگر قبلاً با پایتون کار نکرده ایم، بیشتر با آن آشنا شویم.
برای این کار ، یک ویرایشگر متن خط فرمان مانند nano را باز خواهیم کرد و یک فایل جدید ایجاد می کنیم:
(my_env) Sammy@ubuntu:~/environments$ nano hello.py

پس از باز شدن فایل متنی در پنجره ترمینال ، برنامه خود را تایپ می کنیم:
print(Hello, World!”)
Copy
با زدن کلیدهای CTRL و X از nano خارج شوید و هنگامی که از شما خواسته شد فایل را ذخیره کنید y را فشار دهید.
پس از بیرون آمدن از nano و بازگشت به پوسته خود ، اجازه دهید برنامه را اجرا کنیم:
(my_env) Sammy@ubuntu:~/environments$ python hello.py

برنامه hello.py که به تازگی ایجاد کرده اید باید باعث شود ترمینال شما خروجی زیر را تولید کند:
Output
Hello, World!

برای ترک محیط ، دستور deactivate را تایپ کنید و به دیرکتوری اصلی خود باز خواهید گشت.
نتیجه
تبریک می گویم! در این مرحله شما یک محیط برنامه نویسی پایتون 3 در سرور مجازی Ubuntu Linux خود تنظیم کرده اید و هم اکنون می توانید یک پروژه رمزگذاری را شروع کنید!
اگر از یک دستگاه محلی به جای سرور مجازی استفاده می کنید ، به مجموعه آموزشهای مربوط به سیستم عامل خود در مجموعه نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای پایتون 3” مراجعه کنید.
با آماده شدن سرور مجازی برای توسعه نرم افزار ، می توانید با خواندن کتاب الکترونیکی رایگان نحوه کد نویسی در Python 3 ، یا مراجعه به آموزش های پروژه برنامه نویسی ، اطلاعات بیشتری درباره کد نویسی در پایتون کسب کنید.

 

برچسب‌ها:


زبان برنامه نویسی پایتون یک انتخاب عالی هم برای مبتدیان و هم توسعه دهندگان با تجربه میباشد. این زبان انعطاف پذیر و همه کاره است و می تواند در بسیاری از موارد به خاطر داشتن نقاط قوت در اسکریپت ، اتوماسیون ، تجزیه و تحلیل داده ها ، یادگیری ماشین و توسعه back-end مورد استفاده قرار گیرد. تیم توسعه پایتون برای اولین بار در سال 1991 با نامی الهام گرفته از گروه طنز بریتانیایی مونتی پایتون، آن را منتشر کردند و میخواستند پایتون را به زبانی تبدیل کنند که استفاده از آن بسیار جالب باشد.
در این آموزش سرور مجازی Ubuntu 20.04 شما با یک محیط برنامه نویسی Python 3 تنظیم می شود. برنامه نویسی روی سرور مجازی مزایای بسیاری دارد و از همکاری در پروژه های توسعه پشتیبانی می کند. اصول کلی این آموزش در مورد هرگونه توزیع Debian Linux کاربرد دارد.
پیش نیازها
برای تکمیل این آموزش ، شما باید یک کاربر غیر ریشه با امتیازات sudo در سرور مجازی Ubuntu 20.04 داشته باشید. برای یادگیری چگونگی دستیابی به این راه اندازی ، راهنمای تنظیم اولیه سرور مجازی ما را دنبال کنید.
اگر قبلاً با محیط ترمینال آشنایی ندارید ، می توانید مقاله مقدمه ای بر ترمینال لینوکس” را برای جهت دهی بهتر مطالعه کنید.
با راه اندازی سرور مجازی و کاربر ، آماده شروع کار هستید.
مرحله 1 – تنظیم پایتون 3
اوبونتو 20.04 و سایر نسخه های دبیان لینوکس ، Python 3 و Python 2 را از قبل نصب شده دارد. برای اطمینان از به روز بودن نسخه های خود ، بیایید سیستم را با دستور APT به روز رسانی کنیم تا با ابزار بسته بندی پیشرفته اوبونتو همکاری کند:
$ sudo apt update

$ sudo apt -y upgrade

پرچم -y تأیید خواهد کرد که ما با نصب همه موارد موافق هستیم ، اما بسته به نسخه لینوکس شما ، ممکن است لازم باشد که با به روزرسانی و ارتقای سیستم ، پیام های بیشتری را تأیید کنید.
پس از اتمام روند ، می توانیم با تایپ کردن دستور زیر نسخه پایتون 3 که در سیستم نصب شده است را بررسی کنیم:
$ python3 -V

در پنجره ترمینال خروجی دریافت خواهید کرد که شماره نسخه را به شما اطلاع می دهد. در حالی که ممکن است تعداد متفاوت باشد ، خروجی مشابه این خواهد بود:
Output
Python 3.8.2

برای مدیریت بسته های نرم افزاری برای پایتون ، بیایید pip را نصب کنیم ، ابزاری که بسته های برنامه نویسی را که ممکن است بخواهیم در پروژه های توسعه خود استفاده کنیم ، نصب و مدیریت خواهد کرد. می توانید با خواندن چگونگی وارد کردن ماژول ها در پایتون 3” در مورد ماژول ها یا بسته هایی که می توانید با pip نصب کنید اطلاعات کسب کنید.
$ sudo apt install -y python3-pip

بسته های پایتون با تایپ این دستور قابل نصب هستند:
$ pip3 install package_name

در اینجا ، pack_name می تواند به هر بسته یا کتابخانه Python مانند Django برای توسعه وب یا NumPy برای محاسبات علمی اشاره کند. بنابراین اگر می خواهید NumPy را نصب کنید ، می توانید با دستور pip3 install numpy این کار را انجام دهید.
چند بسته و ابزار توسعه دیگر وجود دارد که باید اطمینان حاصل شود که یک مجموعه قوی برای محیط برنامه نویسی خود داریم:
$ sudo apt install -y build-essential libssl-dev libffi-dev python3-dev

پس از راه اندازی پایتون و نصب pip و سایر ابزارها ، می توانیم یک محیط مجازی برای پروژه های توسعه خود تنظیم کنیم.
مرحله 2 – تنظیم یک محیط مجازی
محیط های مجازی شما را قادر می سازد برای پروژه های پایتون فضایی مجزا در سرور مجازی خود داشته باشید ، اطمینان حاصل کنید که هر یک از پروژه های شما می توانند مجموعه ای از متعلقات خاص خود را داشته باشند که هیچ یک از پروژه های دیگر شما را مختل نمی کند.
تنظیم یک محیط برنامه نویسی ، کنترل بیشتری بر روی پروژه های Python و نحوه دستیابی به نسخه های مختلف بسته ها برای ما فراهم می کند. این امر به ویژه هنگام کار با بسته های شخص ثالث بسیار مهم است.
می توانید همانطور که می خواهید محیط برنامه نویسی Python را تنظیم کنید. هر محیط در واقع یک دیرکتوری یا پوشه ای در سرور مجازی شماست که چندین اسکریپت در آن وجود دارد تا بتواند به عنوان یک محیط عمل کند.
در حالی که چند روش برای دستیابی به یک محیط برنامه نویسی در پایتون وجود دارد ، ما در اینجا از ماژول venv استفاده می کنیم که بخشی از کتابخانه استاندارد Python 3 است. بگذارید venv را با تایپ کردن دستور زیر نصب کنیم:
$ sudo apt install -y python3-venv

با استفاده از این نصب ، آماده ایجاد محیط هستیم. باید یا انتخاب کنیم که می خواهیم محیط های برنامه نویسی پایتون را در کدام دیرکتوری قرار دهیم ، یا یک دیرکتوری جدید با mkdir ایجاد کنیم ، مانند:
$ kdir environments

$ cd environments
وقتی در دایرکتوری قرار گرفتید که میخواهید محیط در آن جا باشد ، می توانید با اجرای دستور زیر محیطی ایجاد کنید:
$ python3.6 -m venv my_env

در اصل ، pyvenv یک دیرکتوری جدید ایجاد می کند که شامل چند آیتم است که می توانیم با دستور ls آنها را مشاهده کنیم:
$ ls my_env

Output
bin include lib lib64 pyvenv.cfg share

این فایلها با هم کار می کنند تا اطمینان حاصل کنند که پروژه های شما از بستر وسیع دستگاه محلی شما جدا شده اند ، به گونه ای که فایل های سیستم و فایل های پروژه مخلوط نشوند. این روش خوبی برای کنترل نسخه و اطمینان از دسترسی هر یک از پروژه های شما به بسته های خاص مورد نیاز خود است. Python Wheels یک فرمت بسته ساخته شده برای Python است که می تواند با کاهش تعداد دفعات لازم برای کامپایل ، باعث افزایش سرعت تولید نرم افزار شود ، و در دیرکتوری share اوبونتو 20.04 قرار خواهد گرفت.
برای استفاده از این محیط ، باید آن را فعال کنید ، که می توانید با تایپ دستور زیر که اسکریپت activate  را فراخوانی می کند به آن دست پیدا کنید.
$ source my_env/bin/activate

خط فرمان شما اکنون با نام محیط شما پیشوند داده می شود ، در این حالت my_env نام دارد. بسته به اینکه کدام نسخه لینوکس را اجرا میکنید، پیشوند شما ممکن است متفاوت باشد ، اما نام محیط شما در پرانتز باید اولین چیزی باشد که در خط python مشاهده می کنید:
(my_env) Sammy@ubuntu:~/environments$
این پیشوند به ما اطلاع می دهد که محیط my_env در حال حاضر فعال است ، به این معنی که وقتی ما در اینجا برنامه هایی را ایجاد می کنیم آنها فقط از تنظیمات و بسته های خاص این محیط استفاده می کنند.
توجه: در محیط مجازی می توانید به جای python3 از فرمان python استفاده کنید و در صورت تمایل به جای pip3 از pip استفاده کنید. اگر در خارج از محیط خود از پایتون 3 در دستگاه خود استفاده می کنید ، لازم است که از دستورات python3 و pip3 استفاده کنید.

بعد از طی کردن این مراحل ، محیط مجازی شما آماده استفاده است.
مرحله 3 – ایجاد یک برنامه ” hello, world ”
اکنون که محیط مجازی ما تنظیم شده است ، بیایید یک برنامه ” hello, world معمولی ایجاد کنیم. این امر به ما امکان می دهد تا محیط خود را مورد آزمایش قرار دهیم و این امکان را برای ما فراهم می کند که اگر قبلاً با پایتون کار نکرده ایم، بیشتر با آن آشنا شویم.
برای این کار ، یک ویرایشگر متن خط فرمان مانند nano را باز خواهیم کرد و یک فایل جدید ایجاد می کنیم:
(my_env) Sammy@ubuntu:~/environments$ nano hello.py

پس از باز شدن فایل متنی در پنجره ترمینال ، برنامه خود را تایپ می کنیم:
print(Hello, World!”)
Copy
با زدن کلیدهای CTRL و X از nano خارج شوید و هنگامی که از شما خواسته شد فایل را ذخیره کنید y را فشار دهید.
پس از بیرون آمدن از nano و بازگشت به پوسته خود ، اجازه دهید برنامه را اجرا کنیم:
(my_env) Sammy@ubuntu:~/environments$ python hello.py

برنامه hello.py که به تازگی ایجاد کرده اید باید باعث شود ترمینال شما خروجی زیر را تولید کند:
Output
Hello, World!

برای ترک محیط ، دستور deactivate را تایپ کنید و به دیرکتوری اصلی خود باز خواهید گشت.
نتیجه
تبریک می گویم! در این مرحله شما یک محیط برنامه نویسی پایتون 3 در سرور مجازی Ubuntu Linux خود تنظیم کرده اید و هم اکنون می توانید یک پروژه رمزگذاری را شروع کنید!
اگر از یک دستگاه محلی به جای سرور مجازی استفاده می کنید ، به مجموعه آموزشهای مربوط به سیستم عامل خود در مجموعه نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای پایتون 3” مراجعه کنید.
با آماده شدن سرور مجازی برای توسعه نرم افزار ، می توانید با خواندن کتاب الکترونیکی رایگان نحوه کد نویسی در Python 3 ، یا مراجعه به آموزش های پروژه برنامه نویسی ، اطلاعات بیشتری درباره کد نویسی در پایتون کسب کنید.

 

برچسب‌ها:


سرور مجازی Apache HTTP پرکاربردترین وب سرور مجازی در جهان است. این نرم افزار بسیاری از ویژگی های قدرتمند از جمله ماژول های قابل لود پویا ، پشتیبانی رسانه ای قوی و ادغام گسترده با سایر نرم افزارهای محبوب را ارائه می دهد.
در این راهنما یک سرور مجازی وب Apache با هاست های مجازی روی سرور مجازی CentOS 8 خود نصب خواهید کرد.
پیش نیازها
برای تکمیل این راهنما به موارد زیر نیاز دارید:
• یک کاربر غیر ریشه با امتیازات sudo که در سرور مجازی شما پیکربندی شده باشد ، و با دنبال کردن راهنمای اولیه ستاپ سرور مجازی برای CentOS 8 تنظیم شده باشد.
• با پیروی از مرحله 4 تنظیم اولیه سرور مجازی با CentOS 8 (مرحله توصیه شده) در راهنمای بالا ، اطمینان حاصل کنید که یک فایروال پایه پیکربندی شده است.
مرحله 1 – نصب Apache
Apache در مخازن پیش فرض نرم افزار CentOS موجود است ، به این معنی که می توانید آن را با مدیر بسته dnf نصب کنید.
وقتی که کاربر sudo غیر ریشه در پیش نیازها پیکربندی شد ، بسته Apache را نصب کنید:
⦁ $ sudo dnf install httpd

پس از تأیید نصب ، dnf ، Apache و کلیه متعلقات مورد نیاز را نصب می کند.
با تکمیل مرحله 4 راهنمای ستاپ اولیه سرور مجازی CentOS 8 ذکر شده در بخش پیش نیازها ، در حال حاضر firewalld  را بر روی سرور مجازی خود نصب کرده اید تا درخواست های روی HTTP را انجام دهید.
اگر همچنین قصد دارید Apache را برای ارائه محتوا از طریق HTTPS پیکربندی کنید ، بهتر اسن با فعال کردن سرویس https ، پورت 443 را نیز باز کنید:
⦁ $ sudo firewall-cmd –permanent –add-service=https

در مرحله بعد ، فایروال را مجدد لود کنید تا این قوانین جدید به مرحله اجرا در بیایند:
⦁ $ sudo firewall-cmd –reload

پس از لود مجدد فایروال ، شما آماده شروع سرویس و بررسی سرور مجازی وب هستید.
مرحله 2 – بررسی سرور مجازی وب خود
Apache پس از اتمام نصب به طور خودکار از CentOS شروع نمی شود ، بنابراین شما نیاز به شروع فرآیند Apache به صورت دستی دارید:
⦁ $ sudo systemctl start httpd

با دستور زیر تأیید کنید که این سرویس در حال اجرا است:
⦁ $ sudo systemctl status httpd

هنگام اجرای سرویس وضعیت فعال را دریافت خواهید کرد:
Output
● httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disa>
Active: active (running) since Thu 2020-04-23 22:25:33 UTC; 11s ago
Docs: man:httpd.service(8)
Main PID: 14219 (httpd)
Status: Running, listening on: port 80”
Tasks: 213 (limit: 5059)
Memory: 24.9M
CGroup: /system.slice/httpd.service
├─14219 /usr/sbin/httpd -DFOREGROUND
├─14220 /usr/sbin/httpd -DFOREGROUND
├─14221 /usr/sbin/httpd -DFOREGROUND
├─14222 /usr/sbin/httpd -DFOREGROUND
└─14223 /usr/sbin/httpd -DFOREGROUND

در این مرحله، این سرویس با موفقیت شروع شده است. با این حال ، بهترین راه برای آزمایش، درخواست یک صفحه از Apache است.
برای تأیید صحت اجرای نرم افزار از طریق آدرس IP خود ، می توانید به صفحه فرود پیش فرض Apache دسترسی پیدا کنید. اگر آدرس IP سرور مجازی خود را نمی دانید ، می توانید آن را چند راه مختلف از خط فرمان دریافت کنید.
برای بازگشت به خط فرمان q و سپس دستور زیر را تایپ کنید:
⦁ $ hostname -I

این دستور همه آدرس های شبکه هاست را نشان می دهد ، بنابراین شما چند آدرس IP را که با space جدا شده اند ، دریافت خواهید کرد. می توانید هر یک از مرورگرهای وب خود را امتحان کنید تا مشخص شود که آیا کار می کنند یا خیر.
از طرف دیگر ، می توانید از Curl برای درخواست IP خود از icanhazip.com استفاده کنید ، که آدرس IPv4 عمومی شما را به عنوان خوانده شده از یک مکان دیگر در اینترنت به شما می دهد:
⦁ $ curl -4 icanhazip.com

هنگامی که آدرس IP سرور مجازی خود را پیدا کردید ، آن را در نوار آدرس مرورگر خود وارد کنید:
http://your_server_ip
صفحه پیش فرض CentOS 8 Apache را مشاهده خواهید کرد:

این صفحه نشان می دهد که Apache درست کار می کند. این برنامه همچنین شامل برخی از اطلاعات اولیه در مورد فایل های مهم Apache و مکان های دایرکتوری است.
مرحله 3 – مدیریت فرایند Apache
اکنون که سرویس نصب و راه اندازی شده است ، می توانید از دستورات مختلف systemctl برای مدیریت سرویس استفاده کنید.
برای متوقف کردن سرور مجازی وب خود ، تایپ کنید:
⦁ $ sudo systemctl stop httpd

برای شروع سرور مجازی وب وقتی متوقف است ، تایپ کنید:
⦁ $ sudo systemctl start httpd

برای متوقف کردن و شروع مجدد سرویس ، تایپ کنید:
⦁ $ sudo systemctl restart httpd

اگر به سادگی تغییرات پیکربندی را انجام می دهید ، Apache اغلب می تواند بدون افت اتصالات مجدد لود شود. برای انجام این کار ، از این دستور استفاده کنید:
⦁ $ sudo systemctl reload httpd

به طور پیش فرض ، Apache به گونه ای تنظیم می شود که به طور خودکار شروع به کار کند. اگر این چیزی نیست که می خواهید ، با تایپ کردن دستور زیر این رفتار را غیرفعال کنید:
⦁ $ sudo systemctl disable httpd

برای فعال کردن مجدد سرویس در هنگام بوت، این دستور را تایپ کنید:
⦁ $ sudo systemctl enable httpd

با دوباره بوت شدن سرور مجازی ، Apache به طور خودکار شروع می شود.
پیکربندی پیش فرض برای Apache به سرور مجازی شما امکان میزبانی وب سایت واحد را می دهد. اگر قصد دارید هاست چندین دامنه در سرور مجازی خود باشید ، باید هاست های مجازی را در سرور مجازی وب Apache خود پیکربندی کنید.
مرحله 4 – تنظیم هاست های مجازی (توصیه می شود)
هنگام استفاده از وب سرور مجازی Apache ، برای کپسوله کردن جزئیات پیکربندی و میزبانی بیش از یک دامنه از یک سرور مجازی واحد می توانید از هاست های مجازی استفاده کنید )اگر با Nginx بیشتر آشنا هستید ، این ها به بلوک های سرور مجازی شباهت دارند). در این مرحله دامنه ای به نام example.com را تنظیم می کنید ، اما باید این نام را با نام دامنه خود جایگزین کنید.
Apache در CentOS 8 دارای یک هاست مجازی است که بصورت پیش فرض فعال شده است تا برای ارائه اسناد از دایرکتوری / var / www / html پیکربندی شود. اگرچه برای یک سایت واحد به خوبی کار می کند ، اگر هاست چندین سایت باشید ، می تواند مشکل آفرین شود. به جای تغییر / var / www / html ، یک ساختار دایرکتوری را در / var / www برای سایت example.com ایجاد خواهید کرد ، و / var / www / html را در جای خود به عنوان دایرکتوری پیش فرض قرار می دهید که در صورتی که درخواست کلاینت با هیچ سایت دیگری مطابقت نداشت، ارائه شود.
دایرکتوری html را برای example.com به شرح زیر بسازید ، از پرچم -p برای ایجاد دایرکتوری های لازم استفاده کنید:
⦁ $ sudo mkdir -p /var/www/example.com/html

دایرکتوری دیگری را برای ذخیره فایل های ورود به سایت ایجاد کنید:
⦁ $ sudo mkdir -p /var/www/example.com/log

سپس ، مالکیت دایرکتوری html را به متغیر محیطی $ USER اختصاص دهید:
⦁ $ sudo chown -R $USER:$USER /var/www/example.com/html

مطمئن شوید که ریشه وب شما دارای مجموعه مجوزهای پیش فرض است
⦁ $ sudo chmod -R 755 /var/www

سپس ، با استفاده از vi یا ویرایشگر مورد علاقه خود ، صفحه index.html نمونه را ایجاد کنید:
⦁ $ sudo vi /var/www/example.com/html/index.html

i را فشار دهید تا به حالت INSERT بروید و نمونه HTML زیر را به فایل اضافه کنید:
/var/www/example.com/html/index.html
<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>

با فشردن ESC ، تایپwq و زدن ENTER فایل را ذخیره کنید و ببندید.
با وجود دایرکتوری سایت و نمونه فایل درج شده ، تقریباً آماده ایجاد فایل های هاست مجازی هستید. فایلهای هاست مجازی پیکربندی سایتهای جداگانه شما را مشخص می کنند و به سرور مجازی وب Apache نشان می دهند که چگونه به درخواستهای دامنه مختلف پاسخ دهد.
قبل از ایجاد هاست مجازی خود ، باید یک دایرکتوری sites-available ایجاد کنید تا آنها را در آن ذخیره کنید. همچنین دایرکتوری sites-enabled ایجاد خواهید کرد که به Apache می گوید یک هاست مجازی آماده خدمت به بازدید کنندگان است. دایرکتوری sites-enabled پیوندهای سمبولیکی را برای هاست های مجازی که می خواهیم منتشر کنیم ، نگه می دارد. هر دو دایرکتوری را با دستور زیر ایجاد کنید:
⦁ $ sudo mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled

در مرحله بعد ، به Apache می گویید که در دایرکتوری sites-enabled به دنبال هاست های مجازی باشد. برای دستیابی به این هدف ، فایل پیکربندی اصلی Apache را با استفاده از vi یا ویرایشگر متن مورد علاقه خود ویرایش کنید و خطی را اضافه کنید که یک دایرکتوری اختیاری برای فایل های پیکربندی اضافی اعلام میکند:
⦁ $ sudo vi /etc/httpd/conf/httpd.conf

برای رفتن به انتهای فایل ، G بزرگ را فشار دهید. سپس i را فشار دهید تا به حالت INSERT بروید و خط زیر را به انتهای فایل اضافه کنید:
/etc/httpd/conf/httpd.conf

# Supplemental configuration
#
# Load config files in the /etc/httpd/conf.d” directory, if any.
IncludeOptional conf.d/*.conf
IncludeOptional sites-enabled/*.conf
پس از افزودن آن خط ، فایل را ذخیره کنید و ببندید. اکنون که دایرکتوری هاست مجازی خود را در اختیار دارید ، فایل هاست مجازی خود را ایجاد خواهید کرد.
با ایجاد یک فایل جدید در دایرکتوری سایتهای موجود شروع کنید:
⦁ $ sudo vi /etc/httpd/sites-available/example.com.conf

بلوک پیکربندی زیر را اضافه کنید ، و دامنه example.com را به نام دامنه خود تغییر دهید:
/etc/httpd/sites-available/example.com.conf
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/html
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/requests.log combined
</VirtualHost>

با این کار به Apache می گویید که چگونه مستقیماً ریشه ای را که در دسترس اسناد وب قرار دارد ، پیدا کند. همچنین به Apache می گوید که خطا و درخواست ورود به این سایت خاص را کجا ذخیره کند.
پس از اتمام فایل را ذخیره کنید و ببندید.
اکنون که فایلهای هاست مجازی را ایجاد کرده اید ، آنها را فعال خواهید کرد تا Apache بداند که می تواند آنها را در اختیار بازدید کنندگان قرار دهد. برای انجام این کار ، برای هر هاست مجازی در دایرکتوری sites-enabled ، یک لینک نمادین ایجاد کنید:
⦁ sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf

هاست مجازی شما اکنون پیکربندی شده و آماده ارائه مطالب است. قبل از راه اندازی مجدد سرویس Apache ، مطمئن شوید که SELinux ت های صحیحی را برای هاست های مجازی شما اعمال کرده است.
مرحله 5 – تنظیم مجوزهای SELinux برای هاست های مجازی (توصیه می شود)
SELinux یک ماژول امنیتی هسته لینوکس است که امنیت سیستم های لینوکس را افزایش می دهد. CentOS 8 به SELinux پیکربندی شده برای کار با تنظیمات پیش فرض Apache مجهز شده است. از آنجا که پیکربندی پیش فرض را با تنظیم دایرکتوری ورود به سیستم سفارشی در فایل پیکربندی هاست مجازی تغییر داده اید ، در صورت تلاش برای شروع سرویس Apache ، خطایی دریافت خواهید کرد. برای رفع این مشکل ، شما باید رویکردهای SELinux را به روز کنید تا Apache بتواند در فایل های لازم بنویسد.
روشهای مختلفی برای تنظیم رویکردها بر اساس نیاز محیط شما وجود دارد زیرا SELinux به شما اجازه می دهد سطح امنیتی خود را شخصی سازی کنید. این مرحله شامل دو روش تنظیم رویکردهای Apache خواهد بود: جهانی و در یک دایرکتوری خاص. تنظیم رویکرد در دایرکتوری ها ایمن تر است ، و بنابراین رویکرد توصیه شده میباشد.
تنظیم رویکردهای Apache به صورت جهانی
تنظیم رویکردApache به صورت جهانی به SELinux می گوید که با استفاده از بولی httpd_unified ، با تمام مراحل Apache به طور یکسان رفتار کند. اگرچه این رویکرد راحت تر است ، اما سطح کنترل یکسان با رویکردی که روی یک فایل یا رویکرد دایرکتوری تمرکز دارد به شما نمی دهد.
دستور زیر را برای تنظیم رویکرد عمومی Apache اجرا کنید:
⦁ $ sudo setsebool -P httpd_unified 1

دستور setsebool مقادیر بولی SELinux را تغییر می دهد. پرچم -P مقدار زمان بوت را به روز می کند ، و این تغییر در ریبوت ادامه می یابد. httpd_unified بولی است که به SELinux می گوید در تمام مراحل Apache به یک صورت رفتار کند ، بنابراین شما آن را با مقدار 1 فعال می کنید.
تنظیم رویکردهای Apache در یک دایرکتوری
تنظیم مجوزهای SELinux به صورت جداگانه برای دایرکتوری /var/www/example.com/log به شما امکان کنترل بیشتر روی رویکردهای Apache را می دهد ، اما ممکن است به نگهداری بیشتری نیز نیاز داشته باشد. از آنجا که این گزینه رویکردهای تنظیم جهانی نیست ، لازم است به طور دستی نوع متن را برای هر دایرکتوری جدید وارد کنید که در تنظیمات هاست مجازی شما مشخص شده است.
ابتدا نوع زمینه ای را که SELinux به دایرکتوری /var/www/example.com/log داده است بررسی کنید:
⦁ $ sudo ls -dlZ /var/www/example.com/log/

این دستور محتوای SELinux دایرکتوری را لیست و چاپ می کند. خروجی مشابه زیر را دریافت خواهید کرد:
Output
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 Apr 23 23:51 /var/www/example.com/log/

زمینه فعلی httpd_sys_content_t است ، که به SELinux می گوید فرآیند Apache فقط می تواند فایل های ایجاد شده در این دایرکتوری را بخواند. در این آموزش ، نوع متن دایرکتوری /var/www/example.com/log را به آدرس httpd_log_t تغییر می دهید. این حالت به Apache امکان می دهد فایل های ورود به سیستم برنامه وب را تولید و پیوست کند:
⦁ $ sudo semanage fcontext -a -t httpd_log_t /var/www/example.com/log(/.*)?”

در مرحله بعدی ، از دستور restorecon برای اعمال این تغییرات استفاده کنید و آنها را در ریبوت ادامه دهید:
⦁ $ sudo restorecon -R -v /var/www/example.com/log

پرچم -R این دستور را به صورت بازگشتی اجرا می کند ، به این معنی که هر فایل موجود را برای استفاده از متن جدید به روز می کند. پرچم -v تغییرات متنی که فرمان ایجاد کرده را چاپ می کند. خروجی زیر را دریافت خواهید کرد
Output
Relabeled /var/www/example.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
برای دیدن تغییرات می توانید یک بار دیگر محتوا را لیست کنید:
⦁ $ sudo ls -dlZ /var/www/example.com/log/

خروجی نوع متن به روز شده را منعکس می کند:
Output
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_log_t:s0 6 Apr 23 23:51 /var/www/example.com/log/

اکنون که دایرکتوری /var/www/example.com/log از نوع httpd_log_t استفاده می کند ، آماده آزمایش پیکربندی هاست مجازی خود هستید.
مرحله 6 – آزمایش هاست مجازی (توصیه می شود)
پس از به روزرسانی متن SELinux با هر روشی ، Apache می تواند در دایرکتوری /var/www/example.com/log بنویسد. اکنون می توانید سرویس Apache را با موفقیت مجدداً راه اندازی کنید:
⦁ $ sudo systemctl restart httpd

محتویات دایرکتوری /var/www/example.com/log را لیست کنید تا ببینید آیا Apache فایلهای ورود را ایجاد کرده است:
⦁ $ ls -lZ /var/www/example.com/log

تأییدیه ای دریافت خواهید کرد که Apache قادر به ایجاد فایل های error.log و requests.log مشخص شده در پیکربندی هاست مجازی است:
Output
-rw-r–r–. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 error.log
-rw-r–r–. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 requests.log

اکنون که هاست مجازی خود را تنظیم کرده و مجوزهای SELinux را به روز کرده اید ، Apache اکنون نام دامنه شما را ارائه می دهد. می توانید با رفتن به http://example.com ، این را آزمایش کنید، که باید چیزی شبیه به این را مشاهده کنید:

این عبارت تأیید می کند که هاست مجازی شما با موفقیت پیکربندی شده و محتوا را ارائه میکند. مراحل 4 و 5 را تکرار کنید تا هاست مجازی جدیدی با مجوز SELinux برای دامنه های بیشتر ایجاد کنید.
نتیجه
در این آموزش وب سرور مجازی Apache را نصب و مدیریت کرده اید. اکنون که سرور مجازی وب خود را نصب کرده اید ، گزینه های بسیاری را برای نوع محتوایی که می توانید ارائه کنید و فناوری هایی که می توانید برای ایجاد یک تجربه بهتر استفاده نمایید ، در اختیار دارید.
اگر می خواهید یک برنامه کاربردی کاملتر ایجاد کنید ، می توانید در این مقاله به نحوه پیکربندی پشته LAMP در CentOS 8 مراجعه نمایید.

 

برچسب‌ها:


Drupal یک سیستم مدیریت محتوا (CMS) است که به زبان PHP نوشته شده و تحت مجوز عمومی منبع آزاد GNU توزیع می شود. مردم و سازمانهای مختلف در سراسر جهان از Drupal برای ایجاد سایتهای دولتی ، وبلاگ های شخصی ، کسب و کارها و موارد دیگر استفاده می کنند. آنچه Drupal را از سایر چارچوبهای CMS منحصر به فرد می کند ، جامعه در حال رشد آن و مجموعه ای از ویژگی هایی است که شامل فرآیندهای ایمن ، عملکرد قابل اعتماد ، مدولاریتی (پیمانه ای بودن) و انعطاف پذیری در انطباق است.
Drupal نیاز به نصب پشته LAMP (Linux ، Apache ، MySQLیا PHP) یا پشته LEMP (Linux، Nginx ، MySQL و PHP) دارد ، اما نصب تک تک مؤلفه ها یک کار زمان بر است. ما می توانیم از ابزارهایی مانند Docker و Docker Compose برای ساده کردن روند نصب Drupal استفاده کنیم. در این آموزش از تصاویر Docker برای نصب مولفه های جداگانه در کانتینر Docker استفاده خواهد شد. با استفاده از Docker Compose می توان چندین کانتینر را برای پایگاه داده ، برنامه و شبکه / ارتباط بین آنها تعریف و مدیریت کرد.
در این آموزش Drupal را با استفاده از Docker Compose نصب خواهیم کرد تا بتوانیم از کانتینرینگ استفاده کرده و وب سایت Drupal خود را روی سرورها مستقر کنیم. کانتینرهایی برای یک پایگاه داده MySQL ، وب سرور مجازی Nginx و Drupal اجرا خواهیم کرد. همچنین با بدست آوردن گواهینامه های TLS / SSL با Let’s Encrypt برای دامنه مورد نظر جهت پیوند با سایت خود ، نصب خود را ایمن خواهیم کرد. سرانجام ، یک فرآیند cron را برای تمدید گواهینامه های خود تنظیم خواهیم کرد تا دامنه مان ایمن بماند.
پیش نیازها
برای دنبال کردن این آموزش ، به موارد زیر نیاز خواهیم داشت:
⦁ سروری که اوبونتو .04 را اجرا می کند ، به همراه یک کاربر غیر ریشه با امتیازات sudo و یک فایروال فعال. برای راهنمایی در مورد نحوه تنظیم این موارد ، لطفاً به این راهنمای تنظیم اولیه سرور مجازی مراجعه کنید.
⦁ Docker که طبق مراحل 1 و 2 نحوه نصب و استفاده از Docker در اوبونتو .04 بر روی سرور مجازی نصب شده باشد. این آموزش بر روی نسخه 19.03.8 تست شده است.
⦁ Docker Compose که طبق مرحله 1 نحوه نصب Docker در اوبونتو .04 بر روی سرور مجازی نصب باشد. این آموزش بر روی نسخه 1.21.2 تست شده است.
⦁ نام دامنه ثبت شده. در سراسر این آموزش از your_domain استفاده خواهد کرد. می توانید یک نام دامنه به صورت رایگان در Freenom دریافت کنید ، و یا از ثبت کننده دامنه مورد نظر خود استفاده کنید.
⦁ هر دو فایل DNS زیر برای سرور مجازی شما تنظیم شده باشد.
⦁ یک رکورد A با your_domain که به آدرس IP عمومی سرور مجازی شما اشاره کند.
⦁ رکورد A با www.your_domain که به آدرس IP عمومی سرور مجازی شما نشان می دهد.
مرحله 1 – تعریف پیکربندی وب سرور
قبل از اجرای هر نوع کانتینر ، باید پیکربندی سرور مجازی وب Nginx خود را تعریف کنیم. فایل پیکربندی ما شامل برخی از بلوک های مکانی مخصوص Drupal ، به همراه بلوک موقعیت مکانی برای هدایت درخواست های تأیید Let’s Encrypt به کلاینت Certbot برای تمدید خودکار گواهینامه میباشد.
ابتدا ، اجازه دهید یک دایرکتوری پروژه برای مجموعه Drupal خود به نام drupal ایجاد کنیم:
⦁ $ mkdir drupal

به دیرکتوری جدید ایجاد شده بروید:
⦁ $ cd drupal

اکنون می توانیم یک دایرکتوری برای فایل پیکربندی خود تهیه کنیم:
⦁ $ mkdir nginx-conf

فایل را با nano یا ویرایشگر متن مورد علاقه خود باز کنید:
⦁ $ nano nginx-conf/nginx.conf

در این فایل ، یک بلوک سرور مجازی با دستورالعمل هایی برای نام سرور مجازی و ریشه اسناد ، و بلوک های مکان برای هدایت درخواست کلاینت Certbot برای صدور گواهینامه ها ، پردازش PHP و درخواست های دارایی استاتیک اضافه خواهیم کرد.
کد زیر را در فایل اضافه کنید. حتماً your_domain را با نام دامنه خود جایگزین کنید:
~/drupal/nginx-conf/nginx.conf
server {
listen 80;
listen [::]:80;

server_name your_domain www.your_domain;

index index.php index.html index.htm;

root /var/www/html;

location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass drupal:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

location ~ /\.ht {
deny all;
}

location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}

بلوک سرور مجازی ما شامل اطلاعات زیر است:
دستورالعمل ها:
⦁ listen: به Nginx می گوید که به پورت 80 گوش دهد ، که به ما این امکان را می دهد تا از پلاگین webroot Certbot برای درخواست های گواهی خود استفاده کنیم. توجه داشته باشید که ما هنوز پورت 443 را دراختیار نداریم – پس از اینکه گواهینامه های خود را با موفقیت به دست آوردیم ، پیکربندی خود را برای شامل شدن SSL به روز خواهیم کرد.
⦁ server_name: نام سرور مجازی ما و بلوک سرور مجازی را که باید برای درخواست به سرور مجازی ما استفاده شود ، تعریف می کند. حتما your_domain را در این خط با نام دامنه خود جایگزین کنید.
⦁ index: فایل هایی را که هنگام پردازش درخواست به سرور مجازی ما به عنوان دیرکتوری استفاده می شوند ، تعریف می کند. ما ترتیب پیش فرض اولویت را در اینجا تغییر داده ایم ، index.php را در جلوی index.html قرار می دهیم تا Nginx در صورت امکان فایلهایی به نام index.php را در اولویت قرار دهد.
⦁ Root: دستورالعمل root دیرکتوری اصلی برای درخواست به سرور مجازی ما را نامگذاری می کند. این دیرکتوری ، / var / www / html ، به عنوان یک نقطه نصب در زمان ساخت با دستورالعمل هایی در Drupal Dockerfile ما ایجاد می شود. این دستورالعمل Dockerfile همچنین اطمینان حاصل می کند که فایل های موجود در نسخه Drupal روی این حجم نصب شده اند.
⦁ rewrite: اگر عبارت معمول و مشخص شده (^/core/authorize.php/core/authorize.php(.*)$) با یک URI درخواستی مطابقت داشته باشد ، URI همانطور که در رشته جایگزینی مشخص شده است تغییر می کند (/core/authorize.php$1)
بلوک های موقعیت مکانی:
⦁ location ~ /.well-known/acme-challenge : این بلوک موقعیت مکانی درخواست ها به دایرکتوری .well-known را مدیریت میکند که در آن Certbot یک فایل موقت قرار می دهد تا تأیید کند که DNS برای دامنه ما روی سرور مجازی مناسب میباشد. با استقرار این پیکربندی ، می توانیم از پلاگین webroot Certbot برای به دست آوردن گواهینامه های دامنه خود استفاده کنیم.
⦁ location / : در این بلوک موقعیت مکانی ، ما از یک دستورالعمل try_files برای بررسی فایل های مطابق با درخواست های URI استفاده خواهیم کرد. با این وجود ، به جای بازگشت یک وضعیت 404 Not Found به عنوان پیش فرض ، با آرگومان های درخواست ، کنترل را به فایل index.php Drupal خواهیم داد.
⦁ location ~ \.php$ : این بخش موقعیت مکانی پردازش PHP و پروکسی این درخواستها به کانتینر Drupal را مدیریت می کند. از آنجا که تصویر Drupal Docker ما مبتنی بر تصویر php: fpm خواهد بود ، همچنین گزینه های پیکربندی خاص را در پروتکل FastCGI در این بلوک قرار خواهیم داد. Nginx برای درخواست های PHP به یک پردازنده مستقل PHP احتیاج دارد: در مورد ما ، این درخواست ها توسط پردازنده php-fpm که همراه با تصویر php: fpm است ، انجام می شود. علاوه بر این ، این بلوک موقعیت مکانی شامل دستورالعمل ها ، متغیرها و گزینه های خاص FastCGI است که درخواست ها به برنامه Drupal را که در کانتینر Drupal ما اجرا می شود ، پروکسی میکند، و شاخص مورد نظر را برای URI درخواستی تجزیه شده و درخواست های URI تنظیم میکند.
⦁ location ~ /\.ht : این بلوک فایل های html دسترسی را از آنجایی که Nginx به آنها سرویس نمی دهد ، مدیریت خواهد کرد. دستورالعمل deny_all تضمین می کند که فایل های .htaccess هرگز در اختیار کاربران قرار نمی گیرد.
⦁ location = /favicon.ico, location = /robots.txt : این بلوک ها اطمینان حاصل می کنند که درخواست ها به /favicon.ico و /robots.txt وارد نشوند.
⦁ location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ : این بلوک ورود به سیستم برای درخواست های دارایی استاتیک را غیرفعال می کند و تضمین می کند که این دارایی ها بسیار قابل ذخیره هستند ، زیرا ارائه آن ها معمولاً گران است.
برای کسب اطلاعات بیشتر در مورد پراکسی FastCGI ، به راهنمای درک و اجرای Proxying FastCGI در Nginx مراجعه کنید. برای کسب اطلاعات در مورد بلوک های سرور و موقعیت مکانی ، به راهنمای درک سرور Nginx و الگوریتم های انتخاب بلوک موقعیت مراجعه کنید.
پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.
با تنظیم Nginx در محل خود ، می توانید به سراغ ایجاد متغیرهای محیط بروید تا در زمان اجرا به کانتینرها برنامه و پایگاه داده خود منتقل شوید.
مرحله 2 – تعیین متغیرهای محیط
برنامه Drupal ما برای ذخیره اطلاعات مربوط به سایت به یک پایگاه داده (MySQL ، PostgresSQL و غیره) نیاز دارد. برای دسترسی به کانتینر پایگاه داده (MySQL) ، کانتینر Drupal در زمان اجرا به برخی از متغیرهای محیطی نیاز دارد. این متغیرها حاوی اطلاعات حساسی مانند اعتبارات پایگاه داده هستند ، بنابراین نمی توانیم مستقیماً آنها را در فایل Docker Compose قرار دهیم – فایل اصلی که حاوی اطلاعاتی در مورد نحوه اجرای کانتینرهای ما است.
همیشه توصیه می شود مقادیر حساس را در فایل .env تنظیم کنید و گردش آن را محدود کنید. این کار مانع از کپی شدن این مقادیر در مخازن پروژه می شود و در معرض دید عموم قرار نمیگیرد.
در دیرکتوری اصلی پروژه ، ~ / drupal ، فایلی با نام .env ایجاد و آن را باز کنید:
⦁ $ nano .env

متغیرهای زیر را به فایل .env اضافه کنید و بخش هایلایت شده را با اعتبار مورد نظر خود جایگزین کنید:
~/drupal/.env
MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=drupal
MYSQL_USER=drupal_database_user
MYSQL_PASSWORD=drupal_database_password

اکنون گذرواژه را برای حساب ریشه MySQL و همچنین نام کاربری و رمزعبور مورد نظر خود برای بانک اطلاعات برنامه خود اضافه کرده ایم.
فایل .env ما حاوی اطلاعات حساسی است ، بنابراین همیشه توصیه می شود آن را در فایل های .gitignore و .dockerignore یک پروژه قرار دهید تا به مخازن Git و تصاویر Docker اضافه نشود.
اگر می خواهید برای کنترل نسخه با Git کار کنید ، دیرکتوری کاری فعلی خود را به عنوان یک مخزن با git init مقداردهی کنید:
⦁ $ git init

فایل gitignore را باز کنید:
⦁ $ nano .gitignore

موارد زیر را اضافه کنید:
~/drupal/.gitignore
.env
فایل را ذخیره کنید و از آن خارج شوید.
به همین ترتیب ، فایل .dockerignore را باز کنید:
⦁ $ nano .dockerignore

سپس موارد زیر را اضافه کنید:
~/drupal/.dockerignore
.env
.git
فایل را ذخیره کنید و از آن خارج شوید.
اکنون که برای حفظ اعتبار خود به عنوان متغیرهای محیطی اقداماتی انجام داده ایم ، بیایید به مرحله بعدی تعریف خدمات خود در فایل docker-compose.yml برویم.
مرحله 3 – تعریف خدمات با Compose Docker
Docker Compose ابزاری برای تعریف و اجرای برنامه های چند کانتینری Docker است. ما برای پیکربندی خدمات برنامه خود ، یک فایل YAML تعریف می کنیم. سرویس در Docker Compose یک کانتینر در حال اجرا است و Compose به ما اجازه می دهد تا این سرویس ها را با حجم و شبکه های مشترک پیوند دهیم.
کانتینرهای مختلفی را برای برنامه Drupal ، پایگاه داده و سرور مجازی وب خود ایجاد خواهیم کرد. در کنار اینها ، همچنین یک کانتینر برای اجرای Certbot ایجاد خواهیم کرد تا بتوانیم گواهینامه هایی را برای سرور مجازی وب خود بدست آوریم.
یک فایل docker-compose.yml ایجاد کنید:
⦁ $ nano docker-compose.yml

برای تعریف نسخه فایل Compose و سرویس پایگاه داده mysql کد زیر را اضافه کنید:
~/drupal/docker-compose.yml
version: 3”

services:
mysql:
image: mysql:8.0
container_name: mysql
command: –default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
– db-data:/var/lib/mysql
networks:
– internal

بیایید همه گزینه های پیکربندی سرویس mysql را یک به یک مرور کنیم:
⦁ image: تصویری را که برای ایجاد کانتینر استفاده یا واکشی خواهد شد، مشخص می کند. همیشه برای جلوگیری از مشکلات بعدی توصیه می شود از تصویر با برچسب نسخه مناسب به استثنای آخرین برچسب استفاده کنید. اطلاعات بیشتر در مورد بهترین روش های Dockerfile را از اسناد Docker بخوانید.
⦁ container_name:برای تعریف نام کانتینر.
⦁ Command: از این گزینه برای رونویسی دستور پیش فرض (دستورالعمل CMD) در تصویر استفاده می شود. MySQL از افزونه های مختلف تأیید اعتبار پشتیبانی کرده است ، اما mysql_native_password m روش معمول تأیید اعتبار است. از آنجا که PHP ، و از این رو Drupal ، از تأیید هویت MySQL جدیدتر پشتیبانی نمی کنند ، ما باید –default-authentication-plugin=mysql_native_password  را به عنوان مکانیزم پیش فرض تأیید اعتبار تنظیم کنیم.
⦁ restart: برای تعریف رویکرد ریستارت کانتینر استفاده می شود. رویکرد unless-stopped یک کانتینر را مجدداً راه اندازی می کند مگر اینکه به صورت دستی متوقف شود.
⦁ env_file: متغیرهای محیط را از یک فایل اضافه می کند. در مورد ما متغیرهای محیط را از فایل .env تعریف شده در مرحله قبل می خواند.
⦁ volumes: مسیرهای هاست یا والیوم های نامگذاری را به عنوان گزینه هایی برای یک سرویس مشخص می کند. ما یک والیوم نامگذاری شده به نام db-data را در دیرکتوری / var / lib / mysql روی کانتینر نصب می کنیم ، جایی که MySQL بصورت پیش فرض فایل های داده خود را خواهد نوشت.
⦁ networks: شبکه داخلی را که سرویس برنامه ما به آن ملحق می شود ، تعریف می کند. ما در انتهای فایل شبکه ها را تعریف خواهیم کرد.
تعریف سرویس mysql ما را انجام داده ایم ، بنابراین اکنون بیایید تعریف سرویس برنامه Drupal را به انتهای فایل اضافه کنیم:
~/drupal/docker-compose.yml

drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
– mysql
restart: unless-stopped
networks:
– internal
– external
volumes:
– drupal-data:/var/www/html

در این تعریف سرویس ، ما همانطور که با سرویس mysql انجام دادیم ، کانتینر خود را نامگذاری می کنیم و یک ت راه اندازی مجدد را تعریف می کنیم. ما همچنین گزینه های خاصی را برای این کانتینر اضافه می کنیم:
Image: در اینجا ، از تصویر 8.7.8-fpm-alpine استفاده می کنیم. این تصویر دارای پردازنده php-fpm است که سرور مجازی وب Nginx ما برای پردازش PHP نیاز دارد. علاوه بر این ، از تصویر alpine ، مشتق از پروژه Alpine Linux استفاده می کنیم ، که باعث کاهش سایز تصویر کلی می شود و در بهترین روش های Dockerfile توصیه می شود. Drupal نسخه های بیشتری از تصاویر دارد ، بنابراین آنها را در Dockerhub بررسی کنید.
depends_on : برای بیان وابستگی بین خدمات استفاده می شود. تعیین سرویس mysql به عنوان وابستگی به کانتینر Drupal ما ، اطمینان حاصل می کند که کانتینر Drupal ما پس از کانتینر mysql ایجاد می شود و برنامه ما را قادر می سازد تا یکنواخت شروع شود.
networks: در اینجا ، ما این کانتینر را به همراه شبکه داخلی به شبکه خارجی اضافه کرده ایم. این اطمینان حاصل می کند که سرویس mysql ما فقط از طریق کانتینر داخلی Drupal از طریق شبکه داخلی قابل دسترسی است در حالی که این کانتینرها را از طریق شبکه خارجی در دسترس سایر کانتینرها قرار می دهد.
volumes: یک والیوم نامگذاری شده به نام drupal-data را بر روی Mount / var / www / html قرار می دهیم که توسط تصویر Drupal ایجاد شده است. استفاده از یک والیوم مشخص از این طریق به ما امکان می دهد تا کد برنامه خود را با سایر کانتینرها به اشتراک بگذاریم.
سپس ، تعریف خدمات Nginx را بعد از تعریف سرویس Drupal اضافه خواهیم کرد:
~/drupal/docker-compose.yml

webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
– drupal
restart: unless-stopped
ports:
– 80:80
volumes:
– drupal-data:/var/www/html
– ./nginx-conf:/etc/nginx/conf.d
– certbot-etc:/etc/letsencrypt
networks:
– external

مجدداً ، برای شروع کار ، کانتینر خود را نامگذاری می کنیم و آن را به کانتینر Drupal وابسته می کنیم. همچنین از یک تصویر alpine– تصویر 1.17.4-alpine Nginx – استفاده می کنیم .
این تعریف خدمات نیز گزینه های زیر را شامل می شود:
⦁ ports: پورت 80 را برای فعال کردن گزینه های پیکربندی تعریف شده در فایل nginx.conf در مرحله 1 در معرض نمایش قرار می دهد.
⦁ volumes: در اینجا ، ما هم والیوم نامگذاری شده و هم مسیر هاست را تعریف می کنیم:
⦁ drupal-data:/var/www/html : کد برنامه Drupal ما را روی دیرکتوری / var / www / html سوار می کند ، که ما آن را به عنوان ریشه در بلوک سرور مجازی Nginx قرار داده ایم.
⦁ ./nginx-conf:/etc/nginx/conf.d : دایرکتوری پیکربندی Nginx را بر روی هاست برای دیرکتوری مربوطه در کانتینر سوار می کند ، و اطمینان حاصل می کند که هرگونه تغییری که در فایل ها ایجاد کنیم روی هاست در کانتینر منعکس می شود.
⦁ certbot-etc:/etc/letsencrypt : مجوزها و کلیدهای Let’s Encrypt برای دامنه ما را روی دایرکتوری مناسب موجود در کانتینر سوار می کند.
⦁ networks: ما شبکه خارجی را فقط برای این تعریف کرده ایم تا این کانتینر بتواند با کانتینر Drupal و نه با کانتینر mysql ارتباط برقرار کند.
سرانجام آخرین تعریف سرویس خود را برای سرویس certbot اضافه خواهیم کرد. حتماً sammy @ your_domain و your_domain را با ایمیل و نام دامنه خود جایگزین کنید:
~/drupal/docker-compose.yml

certbot:
depends_on:
– webserver
image: certbot/certbot
container_name: certbot
volumes:
– certbot-etc:/etc/letsencrypt
– drupal-data:/var/www/html
command: certonly –webroot –webroot-path=/var/www/html –email sammy@your_domain –agree-tos –no-eff-email –staging -d your_domain -d www.your_domain

این تعریف به Compose می گوید تا تصویر certbot / certbot را از Docker Hub دریافت کند. همچنین از این والیوم های نامگذاری شده برای به اشتراک گذاری منابع با کانتینر Nginx ، از جمله گواهینامه های دامنه و کلید در certbot-etcو کد برنامه در drupal-data استفاده می کند.
همچنین از depends_on استفاده کرده ایم تا مطمئن شویم که پس از اجرای سرویس وب سرور مجازی ، کانتینرهای certbot شروع می شوند.
ما هیچ شبکه ای را در اینجا مشخص نکرده ایم زیرا این کانتینر با هیچ سرویس دیگری از طریق شبکه ارتباط برقرار نخواهد کرد. تنها گواهی نامه های دامنه و کلید را اضافه میکند که ما با استفاده از والیوم نام گذاری شده نصب کرده ایم.
همچنین گزینه command  را گنجانده ایم که یک فرمان فرعی را برای اجرا با دستور certbot پیش فرض کانتینر مشخص می کند. کلاینت Certbot از پلاگین ها برای بدست آوردن و نصب گواهینامه ها پشتیبانی می کند. ما از پلاگین webroot برای بدست آوردن گواهی نامه با درج نام مستقل و – webroot در خط فرمان استفاده می کنیم. اطلاعات بیشتر در مورد افزونه و دستورات اضافی را از مستندات رسمی Certbot بخوانید.
پس از تعریف سرویس certbot ، تعریف شبکه و والیوم را اضافه کنید:
~/drupal/docker-compose.yml

networks:
external:
driver: bridge
internal:
driver: bridge

volumes:
drupal-data:
db-data:
certbot-etc:

کلید شبکه سطح بالا به ما امکان می دهد شبکه هایی که باید ایجاد شوند مشخص کنیم. شبکه ها امکان ارتباط بین سرویس ها و کانتینرهای موجود در کلیه پورت ها را از زمان ورود به سایت فراهم می کنند زیرا در همان هاست Docker daemon هستند. ما دو شبکه داخلی و خارجی تعریف کرده ایم تا ارتباط وب سرورها ، Drupal و mysql را تضمین کنیم.
از کلید volumes  برای تعریف والیوم های نامگذاری drupal-data ، db-data و certbot-etc استفاده می شود. هنگامی که Docker والیوم ها را ایجاد می کند ، محتوای والیوم در یک دیرکتوری در سیستم فایل هاست ، / var / lib / docker / volumes / ، که توسط Docker اداره می شود ، ذخیره می گردد. محتویات هر والیوم از این دیرکتوری روی هر کانتینر دیگری که از والیوم استفاده کند سوار می شود. به این ترتیب ، امکان اشتراک گذاری کد و داده ها بین کانتینرها وجود دارد.
فایل نهایی docker-compose.yml این گونه به نظر می رسد:
~/drupal/docker-compose.yml
version: 3”

services:
mysql:
image: mysql:8.0
container_name: mysql
command: –default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
– db-data:/var/lib/mysql
networks:
– internal

drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
– mysql
restart: unless-stopped
networks:
– internal
– external
volumes:
– drupal-data:/var/www/html

webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
– drupal
restart: unless-stopped
ports:
– 80:80
volumes:
– drupal-data:/var/www/html
– ./nginx-conf:/etc/nginx/conf.d
– certbot-etc:/etc/letsencrypt
networks:
– external

certbot:
depends_on:
– webserver
image: certbot/certbot
container_name: certbot
volumes:
– certbot-etc:/etc/letsencrypt
– drupal-data:/var/www/html
command: certonly –webroot –webroot-path=/var/www/html –email sammy@your_domain –agree-tos –no-eff-email –staging -d your_domain -d www.your_domain

networks:
external:
driver: bridge
internal:
driver: bridge

volumes:
drupal-data:
db-data:
certbot-etc:

ما کار تعریف سرویس ها را انجام داده ایم. سپس ، بیایید کانتینر را شروع کنیم و درخواست های گواهینامه خود را آزمایش کنیم.
مرحله 4 – اخذ گواهینامه ها و اعتبارات SSL
ما می توانیم کانتینرهای خود را با دستور docker-compose up شروع کنیم ، که کانتینرهای ما را به ترتیبی که مشخص کرده ایم ، ایجاد و اجرا می کند. اگر درخواست های دامنه ما موفق باشد ، وضعیت خروجی صحیح در خروجی خود و گواهی های صحیح نصب شده در پوشه / etc / letsencrypt / live در کانتینر سرور مجازی وب را مشاهده خواهیم کرد.
برای اجرای کانتینرها در پس زمینه ، از دستور docker-compose up با پرچم -d استفاده کنید:
⦁ $ docker-compose up -d

خروجی مشابهی مشاهده خواهید کرد که تأیید می کند خدمات شما ایجاد شده اند:
Output

Creating mysql … done
Creating drupal … done
Creating webserver … done
Creating certbot … done

با استفاده از دستور docker-compose ps وضعیت خدمات را بررسی کنید:
⦁ $ docker-compose ps

خدمات mysql ، Drupal و وب سرور را با وضعیتUp مشاهده خواهیم کرد ، در حالی که certbot با یک پیام وضعیت 0 خارج می شود:
Output
Name Command State Ports
————————————————————————–
certbot certbot certonly –webroot … Exit 0
drupal docker-php-entrypoint php-fpm Up 9000/tcp
mysql docker-entrypoint.sh –def … Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp

اگر در ستون State برای خدمات mysql ، Drupal یا webserver چیز دیگری به غیر از up مشاهده میکنید و یا وضعیت خروج غیر از 0 برای کانتینر certbot مشاهده می کنید ، حتما ورود های خدمات را با دستور docker-comps logs بررسی نمایید:
⦁ $ docker-compose logs service_name

اکنون می توانیم بررسی کنیم که گواهینامه های ما با استفاده از دستور docker-compose exec در کانتینر webserver نصب شده است:
⦁ $ docker-compose exec webserver ls -la /etc/letsencrypt/live

خروجی زیر را می دهد:
Output
total 16
drwx—— 3 root root 4096 Oct 5 09:15 .
drwxr-xr-x 9 root root 4096 Oct 5 09:15
-rw-r–r– 1 root root 740 Oct 5 09:15 README
drwxr-xr-x 2 root root 4096 Oct 5 09:15 your_domain
اکنون که همه چیز با موفقیت اجرا شد ، می توانیم تعریف سرویس certbot خود را ویرایش کنیم تا پرچم –staging را حذف کنیم.
فایل docker-compose.yml را باز کنید ، به تعریف سرویس certbot بروید و پرچم –staging را در گزینه فرمان با پرچم –force-renewal جایگزین کنید ، که به Certbot می گوید که می خواهید یک گواهی جدید را با دامنه های مشابه گواهی موجود درخواست دهید. تعریف certbot به روز شده به شرح زیر خواهد بود:
~/drupal/docker-compose.yml

certbot:
depends_on:
– webserver
image: certbot/certbot
container_name: certbot
volumes:
– certbot-etc:/etc/letsencrypt
– drupal-data:/var/www/html
command: certonly –webroot –webroot-path=/var/www/html –email sammy@your_domain –agree-tos –no-eff-email –force-renewal -d your_domain -d www.your_domain

برای ایجاد مجدد کانتینر certbot باید دوباره docker-compose up را اجرا کنیم. همچنین گزینه –no-deps را در اختیار میگیریم تا به Compose بگوییم که می تواند از شروع سرویس وب سرور مجازی صرفنظر کند ، زیرا در حال حاضر اجرا میشود:
⦁ $ docker-compose up –force-recreate –no-deps certbot

خروجی را نشان می دهد که تایید میکند درخواست گواهی ما موفق بوده است:
Output
Recreating certbot … done
Attaching to certbot
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Plugins selected: Authenticator webroot, Installer None
certbot | Renewing an existing certificate
certbot | Performing the following challenges:
certbot | http-01 challenge for your_domain
certbot | http-01 challenge for www.your_domain
certbot | Using the webroot path /var/www/html for all unmatched domains.
certbot | Waiting for verification…
certbot | Cleaning up challenges
certbot | IMPORTANT NOTES:
certbot | – Congratulations! Your certificate and chain have been saved at:
certbot | /etc/letsencrypt/live/your_domain/fullchain.pem
certbot | Your key file has been saved at:
certbot | /etc/letsencrypt/live/your_domain/privkey.pem
certbot | Your cert will expire on 2020-01-03. To obtain a new or tweaked
certbot | version of this certificate in the future, simply run certbot
certbot | again. To non-interactively renew *all* of your certificates, run
certbot | certbot renew”
certbot | – Your account credentials have been saved in your Certbot
certbot | configuration directory at /etc/letsencrypt. You should make a
certbot | secure backup of this folder now. This configuration directory will
certbot | also contain certificates and private keys obtained by Certbot so
certbot | making regular backups of this folder is ideal.
certbot | – If you like Certbot, please consider supporting our work by:
certbot |
certbot | Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
certbot | Donating to EFF: https://eff.org/donate-le
certbot |
certbot exited with code 0

اکنون که مجوزهای خود را با موفقیت تولید کردیم ، می توانیم پیکربندی Nginx خود را به روز کنیم تا SSL را شامل شود.
مرحله 5 – اصلاح تنظیمات وب سرور مجازی و تعریف سرویس
پس از نصب گواهینامه های SSL در Nginx ، باید کلیه درخواست های HTTP را به HTTPS تغییر مسیر دهیم. همچنین باید مجوز SSL و مکانهای کلیدی خود را مشخص کنیم و پارامترهای امنیتی و هدرها را اضافه کنیم.
از آنجا که می خواهید سرویس وب سرور مجازی را برای گنجاندن این موارد اضافه، بازتولید کنید ، می توانید اکنون آن را متوقف کنید:
⦁ $ docker-compose stop webserver

خروجی زیر را به دست می دهد:
Output
Stopping webserver … done
سپس ، فایل پیکربندی Nginx را که قبلاً ایجاد کردیم حذف خواهیم کرد:
⦁ $ rm nginx-conf/nginx.conf

نسخه دیگری از فایل را باز کنید:
⦁ $ nano nginx-conf/nginx.conf

برای هدایت HTTP به HTTPS و اضافه کردن اعتبار ، پروتکل و هدرهای امنیتی SSL ، کد زیر را به فایل اضافه کنید. به یاد داشته باشید که your_domain را با دامنه خود جایگزین کنید:
~/drupal/nginx-conf/nginx.conf
server {
listen 80;
listen [::]:80;

server_name your_domain www.your_domain;

location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}

location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name your_domain www.your_domain;

index index.php index.html index.htm;

root /var/www/html;

server_tokens off;

ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

add_header X-Frame-Options SAMEORIGIN” always;
add_header X-XSS-Protection 1; mode=block” always;
add_header X-Content-Type-Options nosniff” always;
add_header Referrer-Policy no-referrer-when-downgrade” always;
add_header Content-Security-Policy default-src * data: ‘unsafe-eval’ ‘unsafe-inline'” always;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass drupal:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

location ~ /\.ht {
deny all;
}

location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}

بلوک سرور مجازی HTTP افزونه webroot را برای درخواستهای تمدید Certbot به دایرکتوری .well-known/acme-challenge مشخص می کند. این برنامه همچنین شامل یک دستورالعمل rewrite  است که درخواست های HTTP را به دیرکتوری اصلی به HTTPS هدایت می کند.
بلوک سرور مجازی HTTPS ، ssl و http2 را فعال می کند. برای کسب اطلاعات بیشتر درباره نحوه تکرار HTTP / 2 در پروتکل های HTTP و فواید آن برای عملکرد وب سایت ، لطفاً به مقدمه نحوه تنظیم Nginx با پشتیبانی HTTP / 2 در اوبونتو .04 مراجعه کنید.
این بلوک ها SSL را فعال می کنند ، همانطور که گواهی SSL و مکان های کلیدی ما را همراه با هدرهای توصیه شده درج کرده ایم. این هدرها به ما این امکان را می دهند که در سایت های آزمایش سرور مجازی SSL Labs و Security Headers امتیاز A کسب کنیم.
دستورالعمل های root  و index  ما نیز در این بلوک قرار دارند ، مانند سایر قسمت های بلوک مکان ویژه Drupal که در مرحله 1 بحث شده است.
فایل پیکربندی Nginx به روز شده را ذخیره کنید و ببندید.
قبل از استفاده مجدد از کانتینر سرور مجازی ، نیاز به اضافه کردن نگاشت پورت 443 روی تعریف سرویس وب سرور مجازی خود خواهیم داشت زیرا مجوزهای SSL را فعال کرده ایم.
فایل docker-compose.yml را باز کنید:
⦁ $ nano docker-compose.yml

تغییرات زیر را در تعریف سرویس وب سرور مجازی ایجاد کنید:
~/drupal/docker-compose.yml

webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
– drupal
restart: unless-stopped
ports:
– 80:80
– 443:443
volumes:
– drupal-data:/var/www/html
– ./nginx-conf:/etc/nginx/conf.d
– certbot-etc:/etc/letsencrypt
networks:
– external

پس از فعال کردن گواهینامه های SSL ، docker-compose.yml به صورت زیر ظاهر می شود:
~/drupal/docker-compose.yml
version: 3”

services:
mysql:
image: mysql:8.0
container_name: mysql
command: –default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
– db-data:/var/lib/mysql
networks:
– internal

drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
– mysql
restart: unless-stopped
networks:
– internal
– external
volumes:
– drupal-data:/var/www/html

webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
– drupal
restart: unless-stopped
ports:
– 80:80
– 443:443
volumes:
– drupal-data:/var/www/html
– ./nginx-conf:/etc/nginx/conf.d
– certbot-etc:/etc/letsencrypt
networks:
– external

certbot:
depends_on:
– webserver
image: certbot/certbot
container_name: certbot
volumes:
– certbot-etc:/etc/letsencrypt
– drupal-data:/var/www/html
command: certonly –webroot –webroot-path=/var/www/html –email sammy@your_domain –agree-tos –no-eff-email –force-renewal -d your_domain -d www.your_domain

networks:
external:
driver: bridge
internal:
driver: bridge

volumes:
drupal-data:
db-data:
certbot-etc:

فایل را ذخیره کنید و ببندید. بیایید سرویس وب سرور مجازی را با پیکربندی به روز شده دوباره بازیابی کنیم:
⦁ $ docker-compose up -d –force-recreate –no-deps webserver

خروجی زیر را ارائه می دهد:
Output
Recreating webserver … done
خدمات را با docker-compose ps بررسی کنید:
⦁ $ docker-compose ps

خدمات mysql ، Drupal و webserver را در حالی مشاهده خواهیم کرد که certbot با یک پیام وضعیت 0 خارج می شود:
Output
Name Command State Ports
————————————————————————–
certbot certbot certonly –webroot … Exit 0
drupal docker-php-entrypoint php-fpm Up 9000/tcp
mysql docker-entrypoint.sh –def … Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

در حال حاضر ، تمام خدمات ما در حال اجرا است و بهتر است با نصب Drupal از طریق رابط وب پیش برویم.
مرحله 6 – تکمیل نصب از طریق رابط وب
بیایید نصب را از طریق رابط وب Drupal انجام دهیم.
در یک مرورگر وب ، به دامنه سرور بروید. به یاد داشته باشید که your_domain خود را در اینجا با نام دامنه خود جایگزین کنید:
https://your_domain

زبان مورد استفاده را انتخاب کنید:

روی Save and continue کلیک کنید . به صفحه نمایه نصب منتقل میشویم. Drupal دارای پروفایل های مختلف است ، بنابراین مشخصات Standard را انتخاب کرده و روی Save and continue کلیک کنید.

پس از انتخاب پروفایل ، به صفحه پیکربندی Database خواهیم رفت. نوع Database را به عنوان MySQL ، MariaDB ، Percona Server یا معادل آن انتخاب کنید و مقادیر مربوط به نام پایگاه داده ، نام کاربری و رمز عبور را از بین مقادیر مربوط به MYSQL_DATABASE ، MYSQL_USER و MYSQL_PASSWORD به ترتیب در فایل.env در مرحله 2 تعریف کردید، انتخاب نمایید. روی Advanced Options کلیک کرده و مقدار هاست را روی نام کانتینر سرویس mysql تنظیم کنید. روی Save and continue کلیک کنید.

پس از پیکربندی پایگاه داده ، نصب ماژول ها و تم های پیش فرض Drupal شروع می شود:

پس از نصب سایت ، به صفحه ستاپ سایت پیکربندی Drupal برای پیکربندی نام سایت ، ایمیل ، نام کاربری ، رمز عبور و تنظیمات ناحیه ای می رویم. اطلاعات را پر کنید و بر روی Save and continue کلیک کنید:

بعد از کلیک روی ذخیره و ادامه ، می توانیم صفحه Welcome to Drupal را مشاهده کنیم ، که نشان می دهد سایت Drupal ما با موفقیت شروع به کار کرده است.

اکنون که نصب Drupal ما تمام شد ، باید اطمینان حاصل کنیم که گواهینامه های SSL ما به صورت خودکار تمدید خواهد شد.
مرحله 7 – تمدید گواهینامه ها
گواهینامه های Let’s Encrypt به مدت 90 روز معتبر هستند ، بنابراین باید یک فرایند تمدید خودکار را تنظیم کنیم تا اطمینان حاصل شود که از بین نمی روند. یکی از راه های انجام این کار ایجاد اقدامی با ابزار برنامه ریزی cron است. در این حالت ، ما یک کار cron ایجاد خواهیم کرد تا به صورت دوره ای یک اسکریپت را اجرا کنیم که گواهینامه های ما را تمدید کرده و پیکربندی Nginx را مجدد لود کند.
بیایید فایل ssl_renew.sh را برای تمدید گواهینامه های خود ایجاد کنیم:
⦁ $ nano ssl_renew.sh

کد زیر را اضافه کنید. به یاد داشته باشید که نام دیرکتوری را با کاربر غیر ریشه خود جایگزین کنید:
~/drupal/ssl_renew.sh
#!/bin/bash

cd /home/sammy/drupal/
/usr/local/bin/docker-compose -f docker-compose.yml run certbot renew –dry-run && \
/usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver

این اسکریپت در دیرکتوری پروژه ~ / drupal تغییر می کند و دستورات docker-compose زیر را اجرا می کند.
docker-compose run : یک کانتینر certbot را شروع می کند و فرمان ارائه شده در تعریف سرویس certbot ما را نادیده می گیرد. به جای استفاده از فرمان فرعی certonly ، ما در اینجا از فرمان فرعی renew  استفاده می کنیم ، که گواهینامه هایی را که نزدیک به انقضا هستند تجدید می کند. برای آزمایش اسکریپت خود گزینه –dry run را در اینجا گنجانده ایم.
docker-compose kill : یک سیگنال SIGHUP را به کانتینر وب سرور مجازی ارسال می کند تا پیکربندی Nginx را مجدد لود کند.
با اجرای دستور زیر فایل را ببندید و آن را قابل اجرا کنید:
⦁ $ sudo chmod +x ssl_renew.sh

در مرحله بعد ، فایل crontab ریشه را باز کنید تا اسکریپت تجدید در یک بازه مشخص اجرا شود:
⦁ $ sudo crontab -e

اگر این اولین بار است که این فایل را ویرایش می کنید ، از شما خواسته می شود ویرایشگر متن را انتخاب کنید تا فایل با آن باز شود:
Output
no crontab for root – using an empty one

Select an editor. To change later, run ‘select-editor’.
1. /bin/nano
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

Choose 1-4 [1]:

در انتهای فایل خط زیر را اضافه کنید و sammy را با نام کاربری خود جایگزین کنید:
crontab

*/5 * * * * /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1

این فاصله زمانی را برای هر پنج دقیقه تعیین می کند ، بنابراین می توانیم آزمایش کنیم که آیا درخواست تجدید ما مطابق پیش بینی شده کار کرده است یا خیر. همچنین یک فایل ورود، cron.log را ایجاد کرده ایم تا خروجی مربوطه را ثبت کنیم.
پس از پنج دقیقه ، از دستور tail استفاده کنید تا cron.log را بررسی کنید و ببینید آیا درخواست تمدید موفقیت آمیز بوده است یا خیر:
⦁ $ tail -f /var/log/cron.log

خروجی تأیید موفقیت آمیز تجدید را مشاهده خواهید کرد:
Output
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
** (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
** (The test certificates above have not been saved.)
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

CTRL + C را فشار دهید تا از روند tail خارج شود.
اکنون می توانیم فایل crontab را تغییر دهیم تا اسکریپت روز دوم هر هفته در ساعت 2 صبح اجرا شود. خط آخر crontab را به صورت زیر تغییر دهید:
crontab

* 2 * * 2 /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1

خارج شوید و فایل را ذخیره کنید.
اکنون ، بیایید گزینه –dry run را از متن ssl_renew.sh حذف کنیم. ابتدا آن را باز کنید:
⦁ $ nano ssl_renew.sh

سپس محتوا را به شرح زیر تغییر دهید:
~/drupal/ssl_renew.sh
#!/bin/bash

cd /home/sammy/drupal/
/usr/local/bin/docker-compose -f docker-compose.yml run certbot renew && \
/usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver

در حال حاضر کار cron از تمدید گواهینامه های SSL با تمدید آنها در صورت واجد شرایط بودن ، مراقبت می کند.
نتیجه
در این آموزش از Docker Compose برای ایجاد نصب Drupal با یک وب سرور مجازی Nginx استفاده کرده ایم. به عنوان بخشی از این گردش کار ، گواهینامه های TLS / SSL را برای دامنه مورد نظر خود با سایت Drupal در نظر گرفتیم و یک کار cron ایجاد کردیم تا در صورت وم این گواهینامه ها را تمدید کنیم.
اگر دوست دارید درباره Docker اطلاعات بیشتری کسب کنید ، به صفحه  Docker topic مراجعه کنید.

 

برچسب‌ها:


هنگام راه اندازی زیرساخت های cloud ، به روزرسانی برنامه ها اغلب دغدغه اصلی شما خواهد بود. با این حال ، عملکرد صحیح برنامه های کاربردی شما بدون پرداختن به نیازهای امنیتی زیرساخت های تان می تواند عواقب مخربی را در پی داشته باشد ، بنابراین بهتر است که این مورد را به عنوان بخشی از راه اندازی اولیه زیرساخت خود در نظر بگیرید.
در این راهنما ، ما برخی از شیوه های اساسی امنیتی را برای پشتیبانی از شما در پیکربندی و تنظیم زیرساخت ها ، انجام خواهیم داد.
کلیدهای SSH
SSH یا همان پوسته ایمن، پروتکل رمزگذاری شده است که برای اداره و برقراری ارتباط با سرور مجازی ها استفاده می شود. هنگام کار با یک سرور مجازی ، احتمالاً بیشتر وقت خود را در یک بخش ترمینال متصل به سرور مجازی خود از طریق SSH می گذرانید. گزینه های امن تر برای ورود به سیستم مبتنی بر رمز عبور ، کلیدهای رمزنگاری SSH روشی مطمئن برای ورود به سرور مجازی شما فراهم می کنند و برای همه کاربران توصیه می شود.
با استفاده از کلیدهای SSH ، یک جفت کلید خصوصی و عمومی به منظور احراز هویت ایجاد می شود. کلید خصوصی توسط کاربر مخفی و ایمن نگه داشته می شود ، در حالی که می توان کلید عمومی را به اشتراک گذاشت.

برای پیکربندی احراز هویت کلید SSH ، باید کلید عمومی کاربر را روی یک سرور مجازی در یک دیرکتوری مخصوص قرار دهید. هنگامی که کاربر به سرور مجازی متصل میشود، سرور مجازی از شما می خواهد اثبات کنید که کلاینت دارای کلید خصوصی مرتبط است. کلاینت SSH برای تأیید اعتبار مالکیت، از کلید خصوصی استفاده می کند. سرور مجازی سپس به کلاینت اجازه می دهد بدون پسورد وصل شود. برای کسب اطلاعات بیشتر در مورد چگونگی عملکرد کلیدهای SSH ، مقاله ما درمورد درک فرآیند رمزگذاری و اتصال SSH را بررسی کنید.
کلیدهای SSH چگونه امنیت را تقویت می کنند؟
با SSH ، هر نوع تأیید هویت – از جمله تأیید گذرواژه – کاملاً رمزگذاری میشود. با این حال ، هنگامی که ورود به سیستم مبتنی بر رمز عبور مجاز است ، کاربران مخرب می توانند برای دستیابی به سرور مجازی ، خصوصاً با سرور مجازی هایی که دارای آدرس IP عمومی هستند ، بارها و بارها تلاش کنند. با داشتن قدرت محاسباتی مدرن ، می توان با خودکار کردن این فرآیند ها و امتحان رمزهای پی در پی پسورد درست را پیدا کرد.
تنظیم تأیید اعتبار کلیدی SSH به شما امکان می دهد تأیید هویت مبتنی بر گذرواژه را غیرفعال کنید. کلیدهای SSH به طور کلی تعداد بیشتری بیت های داده نسبت به رمز عبور دارند ، به این معنی که ترکیب های احتمالی بسیار بیشتری وجود دارد که یک حمله کننده مجبور به اجرای آن ها باشد. بسیاری از الگوریتم های کلید SSH توسط سخت افزار محاسباتی مدرن غیرقابل رکورد محسوب می شوند ، زیرا به مدت زمان زیادی برای اجرای همه حالت های قابل اجرا احتیاج دارند.
نحوه اجرای کلیدهای SSH
کلیدهای SSH روش پیشنهادی برای ورود از راه دور به هر سرور مجازی لینوکس است. یک جفت کلید SSH در دستگاه محلی شما ایجاد می شود و می توانید طی چند دقیقه کلید عمومی را به سرور مجازی های خود منتقل کنید.
برای کسب اطلاعات در مورد نحوه تنظیم کلیدها ، یکی از راهنماهای ما را در مورد SSH ، مانند نحوه تنظیم کلیدهای SSH در اوبونتو 20.04 را دنبال کنید. اگر هنوز هم احراز هویت مبتنی بر رمز عبور را میپسندید ، برای محدود کردن حدس های رمزعبور ، راهکاری مانند fail2ban را روی سرور مجازی های خود در نظر بگیرید.
فایروال ها
فایروال بخشی از نرم افزار است که کنترل می کند چه سرویس هایی در معرض شبکه قرار دارند. این به معنای سد کردن یا محدود کردن دسترسی به هر پورت به جز مواردی است که باید در دسترس عموم باشد.

در یک سرور مجازی معمولی ، خدمات متعددی به طور پیش فرض اجرا می شوند. اینها را می توان در گروههای زیر طبقه بندی کرد:
• خدمات عمومی که برای هر کسی از طریق اینترنت ، غالباً به صورت ناشناس ، قابل دسترسی است. نمونه آن سرور مجازی وب است که ممکن است به سایت شما دسترسی داشته باشد.
• خدمات خصوصی که فقط باید توسط گروه انتخابی از حسابهای مجاز یا از مکانهای خاص به آنها دسترسی پیدا کنید. یک مثال ممکن میتواند پنل کنترل بانک اطلاعاتی باشد.
• خدمات داخلی که فقط باید از درون خود سرور مجازی قابل دسترسی باشند ، بدون آنکه این سرویس را در معرض دید خارجی قرار دهند. به عنوان مثال ، ممکن است یک پایگاه داده باشد که فقط اتصالات محلی را می پذیرد.
فایروال ها می توانند اطمینان حاصل کنند که دسترسی به نرم افزار شما مطابق با مقوله های بالا با درجه های مختلف گرانولاریتی محدود شده است. خدمات عمومی می توانند برای همه باز و در دسترس قرار بگیرند و خدمات خصوصی براساس معیارهای مختلف از جمله انواع اتصال محدود شوند. خدمات داخلی می توانند برای دنیای خارج کاملاً غیرقابل دسترس شوند. برای پورت هایی که مورد استفاده قرار نمی گیرند ، دسترسی در اکثر پیکربندی ها کاملاً مسدود شده است.
فایروال ها چگونه امنیت را تقویت می کنند؟
فایروال ها بخش اساسی هر پیکربندی سرور مجازی هستند. حتی اگر خدمات شما خود دارای ویژگی های امنیتی باشند یا به رابط هایی که می خواهید روی آنها اجرا کنید محدود شده باشند ، یک فایروال به عنوان لایه محافظت بیشتر عمل می کند.
یک فایروال به درستی تنظیم شده ، دسترسی به همه چیز را به جز سرویس های خاصی که باید باز بمانند ، محدود می کند. قرار گرفتن در معرض تنها چند قطعه نرم افزار ، سطح حمله سرور مجازی شما را کاهش می دهد ، و مؤلفه هایی را که در معرض سوء استفاده قرار می گیرند ، محدود می کند.
نحوه اجرای فایروال ها
فایروال های بسیاری برای سیستم های لینوکس در دسترس هستند ، که برخی از آنها پیچیده تر از سایرین میباشند . به طور کلی ، راه اندازی فایروال فقط چند دقیقه طول می کشد و فقط در هنگام تنظیم اولیه سرور مجازی شما یا هنگام تغییر در آنچه در رایانه شما ارائه می شود ، باید این اتفاق بیفتد. در اینجا چند گزینه برای به روز رسانی و اجرا وجود دارد:
⦁ UFW ، یا فایروال غیر پیچیده ، به طور پیش فرض در برخی توزیع های لینوکس مانند اوبونتو نصب شده است. یک فایروال محبوب ، که می توانید در مورد آن در آموزش نحوه تنظیم فایروال با UFW در اوبونتو .04 بیشتر اطلاعات کسب کنید.
⦁ چگونه می توان فایروال را با استفاده از Iptables در Ubuntu 14.04 تنظیم کرد
⦁ نحوه نصب و پیکربندی فایروال سرور مجازی (CSF) در اوبونتو
شبکه های VPC
شبکه های Virtual Private Cloud (VPC) شبکه های خصوصی برای منابع زیرساختی شما هستند. شبکه های VPC ارتباط امن تری بین منابع برقرار می کنند زیرا رابط های شبکه از اینترنت عمومی و دیگر شبکه های VPC در Cloud غیرقابل دسترسی هستند.
چگونه شبکه های VPC امنیت را بالا میبرند
استفاده از شبکه های خصوصی به جای عمومی برای ارتباطات داخلی تقریباً همیشه ترجیح داده می شود ، زیرا شبکه های VPC به شما امکان می دهد گروه هایی از منابع را در شبکه های خصوصی خاص ایزوله کنید. شبکه های VPC فقط با استفاده از رابط های شبکه خصوصی خود از طریق شبکه داخلی به یکدیگر متصل می شوند ، این بدان معناست که ترافیک بین منابع شما از طریق اینترنت عمومی هدایت نمی شود که در آن ممکن است در معرض حمله یا رهگیری قرار گیرد. شبکه های VPC همچنین می توانند برای جداسازی محیط های اجرایی استفاده شوند.
علاوه بر این ، می توانید گیت های اینترنت را به عنوان تنها نقطه دسترسی بین منابع شبکه VPC و اینترنت عمومی خود تنظیم کنید و به شما امکان کنترل و دید بیشتری در ترافیک عمومی متصل به منابع خود می دهد.
نحوه اجرای شبکه های VPC
بیشتر ارائه دهندگان زیرساخت های cloud این امکان را به شما می دهند تا منابع خود را به یک شبکه VPC در داخل دیتاسنترهای خود اضافه کنید.
پیکربندی دستی شبکه خصوصی شما می تواند به پیکربندی پیشرفته سرور مجازی و دانش شبکه نیاز داشته باشد.
بازرسی سرویس
بخش عمده ای از امنیت شامل تجزیه و تحلیل سیستم های ما ، درک سطوح حمله موجود و قفل کردن مولفه ها به بهترین شکل ممکن است.
بازرسی سرویس (Service auditing) فرایندی است برای کشف سرویس هایی که روی سرور مجازی های زیرساخت شما اجرا می شوند. اغلب ، سیستم عامل پیش فرض برای اجرای برخی خدمات در هنگام بوت تنظیم می شود. نصب نرم افزار اضافی گاهی اوقات می تواند متعلقاتی را که به صورت خودکار شروع به کار می کنند به خود جلب کند.

بازرسی سرویس راهی است برای دانستن اینکه چه خدماتی روی سیستم شما اجرا می شود ، از کدام پورت ها برای ارتباط استفاده می کنند و پروتکل های پذیرفته شده چیست. این اطلاعات می تواند به شما در پیکربندی تنظیمات فایروال کمک کند.
بازرسی سرویس چگونه امنیت را تقویت می کند؟
سرور مجازی ها فرآیندهای بسیاری را برای اهداف داخلی و مدیریت کلاینت های خارجی شروع می کنند. هر یک از این موارد سطح حمله گسترده ای را برای کاربران مخرب نشان می دهد. هرچه سرویس های در حال اجرای بیشتری داشته باشید احتمال آسیب پذیری موجود در نرم افزار قابل دسترسی شما بالاتر است.
هنگامی که اطلاعات کافی درباره خدمات شبکه در حال اجرا در دستگاه خود داشتید ، می توانید شروع به تجزیه و تحلیل این سرویس ها کنید. برخی از سؤالاتی که برای هر یک از خود میپرسید عبارتند از:
• آیا این سرویس باید اجرا شود؟
• آیا این سرویس با رابط های شبکه ای اجرا می شود که نباید در آن اجرا شود ؟
⦁ آیا باید به یک IP اختصاص داده شود؟
• آیا قوانین فایروال من ایجاد شده اند تا ترافیک قانونی را به این خدمات بدهد؟
• آیا قوانین فایروال من ترافیک غیرقانونی را مسدود می کند؟
• آیا من روشی برای دریافت هشدارهای امنیتی درباره آسیب پذیری برای هر یک از این خدمات دارم؟
هنگام پیکربندی هر سرور مجازی جدید در زیرساخت های شما این نوع بررسی سرویس یک روش استاندارد است. همچنین انجام بررسی های خدمات هر 6 ماه یکبار به شما کمک می کند تا هرگونه خدماتی که پیکربندی هایی آن ها ناخواسته تغییر کرده اند را پیدا کنید.
نحوه انجام ممیزی های سرویس
برای انجام یک ممیزی اولیه سرویس ، می توانید با استفاده از دستور netstat ببینید که کدام سرویس ها پورت را در هر رابط گوش می دهند. فرمان مثال که نام برنامه ، PID و آدرسهایی را که برای گوش دادن به ترافیک TCP و UDP استفاده می شود نشان می دهد به این شرح است:
⦁ $ sudo netstat -plunt

خروجی دریافت خواهید کرد که اینگونه میباشد:
Output
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 887/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 919/nginx
tcp6 0 0 :::22 :::* LISTEN 887/sshd
tcp6 0 0 :::80 :::* LISTEN 919/nginx

ستونهای اصلی که مورد توجه شما هستند ستونهای نام Proto ، Local Address و PID / Program هستند. اگر آدرس 0.0.0.0 باشد ، خدمات در کلیه رابط های شبکه اتصالات را می پذیرند.
به روزرسانی های بدون نظارت
حفظ به روزرسانی در سرور مجازی می تواند ابزاری قدرتمند برای امنیت باشد. سرور مجازی های unpatched عامل اکثر ناسازگاری ها هستند ، اما به روزرسانی منظم می تواند از آسیب پذیری جلوگیری کند.
به روزرسانی های معمول به یک ادمین نیاز دارند تا به روز رسانی بسته های مختلف روی سرور مجازی را به صورت دستی بررسی و نصب کند. این کار می تواند وقت گیر باشد و ممکن است برخی از بروزرسانی های اصلی فراموش شوند یا از دست بروند. در مقابل ، به روزرسانی های بدون نظارت به سیستم اجازه می دهند تا اکثر بسته ها را به صورت خودکار بروزرسانی کنید.
چگونه به روزرسانی های بدون نظارت امنیت را تقویت می کنند؟
اجرای به روزرسانی های بدون نظارت سطح تلاش لازم برای ایمن نگه داشتن سرور مجازی شما و کوتاه کردن مدت زمانی که سرور مجازی شما در برابر یک اشکال شناخته شده آسیب پذیر است را کاهش می دهد. حتی با به روزرسانی های بسیار منظم ، اشکال زدایی در روزهای پنج شنبه یا جمعه به این معنی است که شما احتمالاً حداقل تا دوشنبه unpatched و آسیب پذیر خواهید بود.
در رابطه با بازرسی سرویس که قبلاً گفته شد ، انجام به روزرسانی خودکار می تواند قرار گرفتن در معرض حملات را به شدت کمتر کند و مدت زمان صرف شده برای حفظ امنیت سرور مجازی شما را کاهش دهد.
نحوه به روزرسانی های بدون نظارت
اکثر توزیعهای ر اکنون به روزرسانی های بدون نظارت را به عنوان گزینه ای میبینند. به عنوان مثال ، در اوبونتو یک ادمین می تواند این دستور را اجرا کند:
⦁ $ sudo apt install unattended-upgrades

برای اطلاعات بیشتر در مورد نحوه اجرای به روزرسانی های بدون نظارت ، راهنماهای مربوط به Ubuntu و Fedora را بررسی کنید.
توجه: این مکانیزم ها فقط نرم افزار به روزرسانی خودکار را از طریق مدیر بسته سیستم شما نصب می کنند. اطمینان حاصل کنید که هر نرم افزار اضافی که ممکن است در حال اجرا است (به عنوان مثال برنامه های وب) یا برای به روزرسانی های خودکار پیکربندی شده اند یا به صورت دستی و بطور مرتب چک می شوند.
غیرفعال کردن ایندکس های دیرکتوری
بیشتر سرور مجازی های وب به طور پیش فرض پیکربندی شده اند تا وقتی کاربر به دایرکتوری که فاقد فایل ایندکس است دسترسی پیدا میکند ، ایندکس های دیرکتوری را نمایش دهد. به عنوان مثال ، اگر می خواهید دایرکتوری به نام دانلودها در وب سرور مجازی خود و بدون پیکربندی اضافی ایجاد کنید ، همه فایل ها برای هر کسی که در دیرکتوری جستجو می کند قابل مشاهده است. برای بسیاری از موارد ، یک نگرانی امنیتی نیست ، اما بسیار محتمل است که چیزی محرمانه در معرض نمایش قرار گیرد. به عنوان مثال ، اگر می خواهید برای وب سایت خود دیرکتوری ایندکس را در سرور مجازی وب خود ایجاد کنید ، این دیرکتوری ممکن است حاوی فایل برای صفحه اصلی وب سایت شما و یک فایل پیکربندی شامل اعتبارات برای پایگاه داده backend وب سایت باشد. بدون غیرفعال کردن ایندکس های دیرکتوری ، هر دو فایل در پوشه برای هر کسی که دیرکتوری را سرچ می کند قابل مشاهده است.
چگونه غیرفعال کردن ایندکس دیرکتوری امنیت را افزایش می دهد؟
ایندکس های دیرکتوری اهداف قانونی دارند ، اما اغلب ناخواسته فایل ها را در معرض دید بازدید کنندگان قرار می دهند. غیرفعال کردن ایندکس های دیرکتوری به عنوان پیش فرض برای سرور مجازی وب شما خطر از دست دادن داده های تصادفی ، نشت یا بهره برداری را با ساختن فایل های دیرکتوری برای بازدیدکنندگان غیرفعال می کند. اگر بازدید کنندگان در دیرکتوری وجود داشته باشند ، بازهم می توانند به فایل ها دسترسی پیدا کنند ، اما غیرفعال کردن ایندکسینگ باعث می شود یافتن فایل ها به طور ناخواسته دشوارتر شوند.
چگونه ایندکس های دایرکتوری را غیرفعال کنیم
در اکثر موارد ، غیرفعال کردن ایندکس های دیرکتوری اضافه کردن یک خط به پیکربندی سرور مجازی وب شماست.
این آموزش حاوی دستورالعملهای عمیق در مورد چگونگی غیرفعال کردن ر های دیرکتوری برای چندین سرور مجازی وب محبوب است.
بکاپ گیری مکرر
اگرچه این ممکن است به عنوان یک نکته امنیتی به نظر نرسد ، بکاپ گیری می تواند در حفظ سیستم ها و داده های در معرض خطر و همچنین تجزیه و تحلیل چگونگی سازگاری سیستم برای شروع ، بسیار مهم باشد. به عنوان مثال ، اگر سرور مجازی شما با باج افزار به خطر بیفتد ، فقدان بکاپ ممکن است به این معنا باشد که تنها انتخاب شما پرداخت باج برای بازگرداندن اطلاعات شما است. اگر به طور مرتب از سیستم ها و داده های خود نسخه پشتیبان تهیه کنید ، میتوانید بدون تعامل با سیستم به خطر افتاده ، به داده های خود دسترسی پیدا کنید و آن ها را بازیابی کنید.
بکاپ های مکرر چگونه امنیت را افزایش میدهند؟
بکاپ گیری با حفظ نسخه های دست نخورده از داده ها قبل از وقوع حملات ، باعث کاهش خطر حذف تصادفی و کاهش خطر از بین رفتن اطلاعات می شود.
علاوه بر موارد باج افزار ، بکاپ گیری منظم می تواند به تجزیه و تحلیل قانونی حملات طولانی مدت کمک کند. اگر تاریخچه داده های خود را ندارید ، تشخیص زمان شروع حمله و اطلاعات به خطر افتاده دشوار یا غیرممکن است.
نحوه اجرای بکاپ های مکرر
بر خلاف سایر روش های این لیست ، اجرای بکاپ گیری می تواند از چیزی بی اهمیت تا فرآیندی بسیار دشوار متفاوت باشد. هنگام فعال کردن نسخه های پشتیبان ، باید از خود بپرسید: اگر سرور مجازی من فردا ناپدید شد ، چگونه می توانیم آن را به عقب برگردانم و راه اندازی کنم؟
در اینجا چند سؤال دیگر وجود دارد که باید هنگام تهیه یک برنامه بازیابی حوادث در نظر بگیرید:
• آیا همیشه باید آخرین نسخه پشتیبان تهیه شود؟ بسته به دفعات تغییر داده های شما ، ممکن است خطر را از پیش فرض به بکاپ قدیمی کاهش دهد
• روند واقعی برای بازیابی نسخه پشتیبان چیست؟ آیا نیاز به ایجاد یک سرور مجازی جدید یا بازگرداندن سرور مجازی موجود دارید؟
• چه مدت می توانید بدون این سرور مجازی در عمل باقی بمانید؟
• آیا به نسخه پشتیبان offsite احتیاج دارم؟
نتیجه
استراتژی های ذکر شده در بالا ، مروری بر برخی از پیشرفتهایی است که می توانید برای بهبود امنیت سیستم های خود داشته باشید. مهم است که بدانید ، اگرچه دیر انجام دادن بهتر از هرگز انجام ندادن است ، اما اثربخشی اقدامات امنیتی با تاخیر طولانی در اجرای آن ها کاهش می یابد. امنیت نمی تواند یک امر فرعی باشد و باید از ابتدا در کنار سرویس ها و برنامه هایی که ارائه می دهید اجرا شود.

 

برچسب‌ها:


Redis یک فروشگاه با حافظه داخلی و مقدار کلید است که به دلیل انعطاف پذیری ، عملکرد و پشتیبانی گسترده از زبان شناخته شده است. این آموزش نحوه نصب ، پیکربندی و ایمن سازی Redis در یک سرور مجازی Ubuntu 20.04 را نشان می دهد.
پیش نیازها
برای تکمیل این راهنما ، به یک سرور مجازی اوبونتو 20.04 که دارای یک کاربر غیر ریشه با امتیازات sudo و دارای یک فایروال اساسی است ، نیاز دارید. می توانید با دنبال کردن راهنمای راه اندازی سرور مجازی اولیه ما این کار را تنظیم کنید.
مرحله 1 – نصب و پیکربندی Redis
ما از مدیر بسته APT برای نصب مجدد مخازن رسمی اوبونتو استفاده خواهیم کرد. از این نوشتار ، نسخه موجود در مخازن پیش فرض 5.0.7 است.
با به روز کردن حافظه نهان بسته محلی apt خود شروع کنید:
$ sudo apt update

سپس Redis را با تایپ این دستور نصب کنید:
$ sudo apt install redis-server

با این کار Redis و متعلقات آن دانلود و نصب می شوند. پس از این ، یک تغییر پیکربندی مهم برای ایجاد در فایل پیکربندی Redis وجود دارد که به طور خودکار در حین نصب ایجاد می شود.
این فایل را با ویرایشگر متن مورد نظر خود باز کنید:
$ sudo nano /etc/redis/redis.conf

در داخل فایل ، دستورالعمل supervised  را پیدا کنید. این دستورالعمل به شما امکان می دهد سیستم شروع را برای مدیریت Redis به عنوان یک سرویس اعلام کنید و کنترل بیشتری بر عملکرد آن به شما ارائه می دهد. دستورالعمل supervised  به صورت پیش فرض تنظیم نشده است. از آنجا که شما اوبونتو را اجرا می کنید ، که از سیستم شروع systemd استفاده می کند ، این را به systemd تغییر دهید:
/etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no – no supervision interaction
# supervised upstart – signal upstart by putting Redis into SIGSTOP mode
# supervised systemd – signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto – detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal process is ready.”
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

این تنها تغییری است که در این مرحله باید در فایل پیکربندی Redis انجام دهید ، بنابراین پس از اتمام آن را ذخیره کنید و ببندید. اگر از nano برای ویرایش فایل استفاده کرده اید ، این کار را با فشار دادن CTRL + X ، Y ، سپس enter انجام دهید.
سپس ، سرویس Redis را مجدداً راه اندازی کنید تا تغییراتی که در فایل پیکربندی ایجاد کرده اید اعمال شوند:
$ sudo systemctl restart redis.service

با این کار ، شما Redis را نصب و پیکربندی کرده اید و در دستگاه شما کار می کند. با این حال ، قبل از شروع استفاده از آن ، بهتر است برای احتیاط ابتدا بررسی کنید که آیا Redis عملکرد صحیحی دارد یا خیر.
مرحله 2 – تست Redis
مانند هر نرم افزاری که به تازگی نصب میشود ، بهتر است که قبل از ایجاد هرگونه تغییر بیشتر در پیکربندی آن ، از عملکرد Redis مطابق آنچه انتظار می رود ، اطمینان حاصل کنیم. ما چند روش را برای بررسی اینکه Redis در این مرحله به درستی کار می کند ، مرور میکنیم.
ابتدا بررسی کنید سرویس Redis در حال اجراست:
$ sudo systemctl status redis

اگر بدون خطا در حال اجرا باشد ، این دستور خروجی مشابه زیر را ایجاد می کند:
Output
● redis-server.service – Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .

در اینجا ، می بینید که Redis در حال اجرا فعال شده است ، به این معنی که هر بار که سرور مجازی بوت شود ، راه اندازی می شود.
توجه: این تنظیمات برای بسیاری از موارد استفاده رایج از Redis مطلوب است. اما اگر ترجیح می دهید هر بار که سرور مجازی خود را راه اندازی میکنید ، Redis را به صورت دستی راه اندازی کنید ، می توانید این کار را با دستور زیر تنظیم کنید:
$ sudo systemctl disable redis

برای آزمایش عملکرد صحیح Redis ، با استفاده از کلاینت خط فرمان به سرور مجازی وصل شوید:
$ redis-cli

در اعلان زیر ، اتصال را با دستور ping تست کنید:
127.0.0.1:6379> ping

Output
PONG
این خروجی تأیید می کند که اتصال سرور مجازی هنوز باقی است. در مرحله بعد ، بررسی کنید که می توانید با اجرای دستور زیر، کلیدها را تنظیم کنید:
127.0.0.1:6379> set test It’s working!”

Output
OK
مقدار را با تایپ این دستور بازیابی کنید:
127.0.0.1:6379> get test

با فرض اینکه همه چیز کار می کنید ، می توانید مقدار ذخیره شده خود را بازیابی کنید:
Output
It’s working!”
پس از تأیید این که می توانید مقدار را بدست آورید ، برای بازگشت به پوسته از قسمت Redis خارج شوید:
127.0.0.1:6379> exit

به عنوان یک آزمایش نهایی ، بررسی خواهیم کرد که آیا Redis قادر به حفظ داده حتی پس از متوقف شدن یا راه اندازی مجدد آن هست یا خیر. برای انجام این کار ، ابتدا نمونه Redis را ریستارت کنید:
$ sudo systemctl restart redis

سپس یک بار دیگر با کلاینت خط فرمان ارتباط برقرار کرده و تأیید کنید که مقدار تست شما هنوز در دسترس است:
$ redis-cli

مقدار کلید شما هنوز باید در دسترس باشد:
Output
It’s working!”
پس از اتمام دوباره از پوسته خارج شوید:
127.0.0.1:6379> exit

با این کار ، نصب Redis شما کاملاً عملیاتی است و برای استفاده شما آماده است. با این حال ، برخی از تنظیمات پیکربندی پیش فرض آن ناایمن است و فرصت حملات و دسترسی به سرور مجازی و داده های آن را می دهد. مراحل باقیمانده در این آموزش ، روش های کاهش این آسیب پذیری ها را مطابق با وب سایت رسمی Redis ارائه میدهد. اگرچه این مراحل اختیاری است و اگر تصمیم به دنبال کردن آنها ندارید ، هنوز هم Redis کار خواهد کرد ، توصیه می شود آنها را انجام دهید تا امنیت سیستم شما بیشتر شود.
مرحله 3 – اتصال به localhost
به طور پیش فرض ، Redis فقط از localhost قابل دسترسی است. با این وجود ، اگر Redis را با پیروی از آموزش دیگری، نصب و پیکربندی کرده اید ، ممکن است فایل پیکربندی را به روز کرده باشید تا بتوانید از هرجای دیگر اتصالات را برقرار کنید. این روش به اندازه کافی برای اتصال به localhost مطمئن نیست.
برای اصلاح این مشکل ، فایل پیکربندی Redis را برای ویرایش باز کنید:
$ sudo nano /etc/redis/redis.conf

این خط را پیدا کرده و اطمینان حاصل کنید که باطل شده است (در صورت وجود # ، آن را حذف کنید):
/etc/redis/redis.conf
bind 127.0.0.1 ::1

پس از اتمام فایل را ذخیره کرده و ببندید (CTRL + X ، Y ، سپس ENTER را فشار دهید).
سپس ، سرویس را مجدداً راه اندازی کنید تا اطمینان حاصل شود که systemd تغییرات شما را خوانده است:
$ sudo systemctl restart redis

برای بررسی اینکه این تغییر به مرحله اجرا گذاشته شده است ، دستور netstat زیر را اجرا کنید:
$ sudo netstat -lnp | grep redis

Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-ser

توجه: ممکن است دستور netstat به طور پیش فرض در سیستم شما در دسترس نباشد. در این صورت می توانید با دستور زیر آن را نصب کنید (به همراه تعدادی دیگر از ابزارهای مفید شبکه):
sudo apt install net-tools

این خروجی نشان می دهد که برنامه redis-server به localhost (127.0.0.1) متصل شده است و تغییری را که اخیراً در فایل پیکربندی ایجاد کرده اید ، نشان می دهد. اگر آدرس IP دیگری را در آن ستون مشاهده می کنید (به عنوان مثال 0.0.0.0) ، پس باید دوبار بررسی کنید که خط صحیح را باطل کرده اید و دوباره سرویس Redis را راه اندازی کنید.
اکنون که نصب Redis فقط به localhost گوش می کند ، انجام درخواست یا دسترسی به سرور مجازی شما برای حمله گران دشوار خواهد بود. با این حال ، در حال حاضر Redis قبل از ایجاد تغییر در پیکربندی یا داده هایی که نگه میدارد ، از کاربران درخواست نمیکند که خود را تأیید کنند. برای رفع این مشکل ،Redis به شما امکان می دهد تا کاربران را قبل از ایجاد تغییر از طریق کلاینت Redis (redis-cli) با گذرواژه تأیید کنید.
مرحله 4 – پیکربندی رمز عبور Redis
پیکربندی رمز عبور Redis یکی از دو ویژگی امنیتی داخلی خود را ایجاد می کند – دستور auth ، که به تایید اعتبار کلاینت ها برای دسترسی به پایگاه داده نیاز دارد. رمز عبور مستقیماً در فایل پیکربندی Redis ، /etc/redis/redis.conf پیکربندی شده است ، بنابراین دوباره آن فایل را با ویرایشگر مورد نظر خود باز کنید:
$ sudo nano /etc/redis/redis.conf

به بخش SECURITY بروید و به دنبال دستورالعملی باشید که وظیفه خواندن را دارد:
/etc/redis/redis.conf
. . .
# requirepass foobared
. . .

با حذف # آن را لغو کنید و foobared  را به یک رمزعبور امن تغییر دهید.
توجه: در بالای دستورالعمل requirepass در فایل redis.conf ، یک اخطار کامنت وجود دارد:
/etc/redis/redis.conf
. . .
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
. . .
بنابراین ، مهم است که یک مقدار بسیار قوی و بسیار طولانی را به عنوان رمزعبور خود تعیین کنید. به جای ایجاد رمز عبور ، می توانید از دستور opensl برای ایجاد پسورد تصادفی استفاده کنید ، مانند مثال زیر. با اتصال خروجی دستور اول به دستور دوم opensl ، همانطور که در اینجا نشان داده شده است ، هرگونه وقفه بین خطوط را که توسط آن دستور اول ایجاد می شود حذف می کند:
$ openssl rand 60 | openssl base64 -A

خروجی شما اینگونه خواهد بود:
Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

پس از کپی پیست کردن خروجی آن فرمان به عنوان مقدار جدید مورد نیاز ، باید این را بخواند:
$ sudo systemctl restart redis.service

پس از تنظیم گذرواژه ، فایل را ذخیره کرده و ببندید ، و Redis را ریستارت کنید:
$ redis-cli

در زیر توالی دستورات مورد استفاده برای تست رمز Redis وجود دارد. دستور اول سعی می کند قبل از تأیید اعتبار ، کلید را روی یک مقدار تنظیم کند:
127.0.0.1:6379> set key1 10

این رمز کار نخواهد کرد زیرا شما تأیید اعتبار نکردید ، بنابراین Redis خطایی را برمی گرداند:
Output
(error) NOAUTH Authentication required.

دستور بعدی با گذرواژه مشخص شده در فایل پیکربندی Redis تأیید اعتبار می کند:
127.0.0.1:6379> auth your_redis_password

Redis تصدیق می کند:
Output
OK
پس از آن ، اجرای دوباره فرمان قبلی موفق خواهد شد:
127.0.0.1:6379> set key1 10

Output
OK

get key1 مقدار کلید جدید را از Redis پرس و جو میکند.
127.0.0.1:6379> get key1

Output
10”

پس از تأیید اینکه می توانید پس از تایید اعتبار دستوراتی را در کلاینت Redis اجرا کنید ، می توانید از redis-cli خارج شوید:
127.0.0.1:6379> quit

در مرحله بعد ، تغییر نام دستورات Redis را بررسی خواهیم کرد که اگر به اشتباه یا توسط یک حمله گر مورد هدف قرار گیرد ، می تواند آسیب جدی به دستگاه شما وارد کند.
مرحله 5 – تغییر نام دستورات خطرناک
ویژگی امنیتی دیگر قرار داده شده در Redis تغییر نام یا غیرفعال کردن کامل فرامین خاصی است که خطرناک به نظر می رسند.
هنگامی که این دستورات توسط کاربران غیرمجاز اجرا می شوند ، می توانند برای پیکربندی ، از بین بردن یا پاک کردن داده های شما استفاده شوند. مانند گذرواژه تأیید اعتبار ، تغییر نام یا غیرفعال کردن دستورات در همان بخش SECURITY فایل /etc/redis/redis.conf پیکربندی شده است.
برخی از دستوراتی که خطرناک به حساب می آیند عبارتند از FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, و  DEBUG
این یک لیست جامع نیست ، اما تغییر نام یا غیرفعال کردن کلیه دستورات موجود در آن لیست ، نقطه شروع خوبی برای افزایش امنیت سرور مجازی Redis شما است.
این که آیا شما باید یک فرمان را غیرفعال کنید یا تغییر نام دهید ، به نیازهای خاص شما یا نیازهای سایت شما بستگی دارد. اگر می دانید هرگز از دستوری که مورد سوءاستفاده قرار می گیرد استفاده نمی کنید ، می توانید آن را غیرفعال کنید. در غیر این صورت ، تغییر نام آن مفید خواهد بود.
برای فعال یا غیرفعال کردن دستورات Redis ، فایل پیکربندی را یک بار دیگر باز کنید:
$ sudo nano /etc/redis/redis.conf

هشدار: مراحل زیر نشانگر نحوه غیرفعال کردن و تغییر نام دستورات مثال است. شما فقط باید انتخاب کنید که که غیرفعال کردن یا تغییر نام چه دستوراتی منطقی میباشد. می توانید لیست کامل دستورات را برای خود مرور کنید و نحوه استفاده آنها در redis.io/commands را تعیین کنید.

برای غیرفعال کردن یک دستور ، کافی است آن را به یک رشته خالی تغییر دهید (که توسط یک جفت علامت نقل قول بدون هیچ کاراکتری بین آنها مشخص شده است) ، همانطور که در زیر نشان داده شده:
/etc/redis/redis.conf
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ”
rename-command FLUSHALL ”
rename-command DEBUG ”
. . .

برای تغییرنام یک فرمان، نام دیگری مانند زیر به آن بدهید. حدس زدن فرمان های تغییر نام یافته باید برای دیگران دشوار باشد اما به راحتی بتوانید آن ها را به خاطر بسپارید.
/etc/redis/redis.conf
. . .
# rename-command CONFIG ”
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

تغییرات خود را ذخیره کرده و فایل را ببندید.
پس از تغییر نام یک فرمان ، با راه اندازی مجدد Redis ، تغییر را اعمال کنید:
$ sudo systemctl restart redis.service

برای آزمایش دستور جدید ، وارد خط فرمان Redis شوید:
$ redis-cli

سپس ، تأیید اعتبار کنید:
127.0.0.1:6379> auth your_redis_password

Output
OK
فرض کنیم که شما دستور CONFIG را مانند مثال قبل به ASC12_CONFIGتغییر نام دادید . ابتدا سعی کنید از دستور اصلی CONFIG استفاده کنید. باید با شکست مواجه شود ، زیرا شما آن را تغییر نام داده اید:
127.0.0.1:6379> config get requirepass

Output
(error) ERR unknown command `config`, with args beginning with:

با این وجود فراخوانی فرمان تغییر نام داده شده موفقیت آمیز خواهد بود. به کوچک و بزرگ بودن کاراکترها حساس نیست:
127.0.0.1:6379> asc12_config get requirepass

Output
1) requirepass”
2) your_redis_password”

درنهایت ، می توانید از redis-cli خارج شوید:
127.0.0.1:6379> exit

توجه داشته باشید که اگر قبلاً از خط فرمان Redis استفاده کرده اید و دوباره Redis را ریستارت کرده اید ، باید مجددا تأیید اعتبار کنید. در غیر این صورت ، اگر یک دستور تایپ کنید ، این خطا را دریافت خواهید کرد:
Output
NOAUTH Authentication required.

به خاطر تغییر نام دستورات ، در پایان بخش SECURITY در /etc/redis/redis.conf یک عبارت احتیاط وجود دارد:
/etc/redis/redis.conf
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .

توجه: پروژه Redis از اصطلاحات master” و slave” استفاده میکند ، در حالی که vpsgol عموماً اصطلاحات primary” و secondary” را ترجیح می دهد به معنی اولیه و ثانویه.
برای جلوگیری از سردرگمی ، تصمیم گرفتیم که در اینجا از اصطلاحات استفاده شده در مستندات Redis استفاده کنیم.
این بدان معناست که اگر دستور تغییر نام یافته در فایل AOF نباشد ، یا اگر موجود باشد اما فایل AOF به slaves ارسال نشده باشد ، دیگر مشکلی وجود نخواهد داشت.
بنابراین ، هنگام تغییر نام دستورات ، این را به خاطر داشته باشید. بهترین زمان برای تغییر نام یک فرمان زمانی است که شما از ماندگاری AOF استفاده نمی کنید ، یا درست بعد از نصب ، یعنی قبل از استقرار برنامه مبتنی بر Redis.
هنگامی که از AOF استفاده می کنید و با یک نصب master slave سرو کار دارید ، این پاسخ را از صفحه صدور GitHub پروژه در نظر بگیرید.
بنابراین ، بهترین روش برای تغییر نام در مواردی از این دست ، این است که مطمئن شوید دستورات تغییر نام یافته به تمام مثال های نصب های master-slave اعمال میشود.
نتیجه
در این آموزش ، Redis را نصب و پیکربندی کرده اید ، تأیید کردید که نصب Redis شما به درستی کار می کند و از ویژگی های امنیتی داخلی استفاده کرده است تا در برابر حملات مخرب کمتر آسیب پذیر باشد.
به خاطر داشته باشید که پس از ورود شخصی به سرور مجازی شما ، دور زدن ویژگی های امنیتی ویژه Redis که ما در آن قرار داده ایم بسیار آسان است. بنابراین ، مهمترین ویژگی امنیتی در سرور مجازی Redis ، فایروال شماست (که در صورت پیروی از آموزش مقدماتی راه اندازی اولیه سرور مجازی اولیه، آن را پیکربندی کرده اید) ، زیرا این کار پرش از آن حصار امنیتی را برای حمله گران بسیار دشوار می کند.

 

برچسب‌ها:


Redis یک فروشگاه با حافظه داخلی و مقدار کلید است که به دلیل انعطاف پذیری ، عملکرد و پشتیبانی گسترده از زبان شناخته شده است. این آموزش نحوه نصب ، پیکربندی و ایمن سازی Redis در یک سرور مجازی Ubuntu .04 را نشان می دهد.
پیش نیازها
برای تکمیل این راهنما ، به یک سرور مجازی اوبونتو .04 که دارای یک کاربر غیر ریشه با امتیازات sudo و دارای یک فایروال اساسی است ، نیاز دارید. می توانید با دنبال کردن راهنمای راه اندازی سرور مجازی اولیه ما این کار را تنظیم کنید.
پس از آماده شدن ، به عنوان کاربر sudo خود به سرور مجازی Ubuntu .04 خود وارد شوید و در زیر ادامه دهید.
مرحله 1 – نصب و پیکربندی Redis
برای به دست آوردن آخرین نسخه Redis ، ما از apt برای نصب آن از مخزن رسمی اوبونتو استفاده خواهیم کرد.
حافظه نهان بسته محلی apt خود را به روز کنید و Redis را با تایپ دستور زیر نصب کنید:
$ sudo apt update

$ sudo apt install redis-server

با این کار Redis و متعلقات آن دانلود و نصب می شوند. پس از این ، یک تغییر پیکربندی مهم برای ایجاد در فایل پیکربندی Redis وجود دارد که به طور خودکار در حین نصب ایجاد می شود.
این فایل را با ویرایشگر متن مورد نظر خود باز کنید:
$ sudo nano /etc/redis/redis.conf

در داخل فایل ، دستورالعمل supervised  را پیدا کنید. این دستورالعمل به شما امکان می دهد سیستم شروع را برای مدیریت Redis به عنوان یک سرویس اعلام کنید و کنترل بیشتری بر عملکرد آن به شما ارائه می دهد. دستورالعمل supervised  به صورت پیش فرض تنظیم نشده است. از آنجا که شما اوبونتو را اجرا می کنید ، که از سیستم شروع systemd استفاده می کند ، این را به systemd تغییر دهید:
/etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no – no supervision interaction
# supervised upstart – signal upstart by putting Redis into SIGSTOP mode
# supervised systemd – signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto – detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal process is ready.”
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

این تنها تغییری است که در این مرحله باید در فایل پیکربندی Redis انجام دهید ، بنابراین پس از اتمام آن را ذخیره کنید و ببندید. سپس ، سرویس Redis را مجدداً راه اندازی کنید تا تغییراتی که در فایل پیکربندی ایجاد کرده اید اعمال شوند:
$ sudo systemctl restart redis.service

با این کار ، شما Redis را نصب و پیکربندی کرده اید و در دستگاه شما کار می کند. با این حال ، قبل از شروع استفاده از آن ، بهتر است برای احتیاط ابتدا بررسی کنید که آیا Redis عملکرد صحیحی دارد یا خیر.
مرحله 2 – تست Redis
مانند هر نرم افزاری که به تازگی نصب میشود ، بهتر است که قبل از ایجاد هرگونه تغییر بیشتر در پیکربندی آن ، از عملکرد Redis مطابق آنچه انتظار می رود ، اطمینان حاصل کنیم. ما چند روش را برای بررسی اینکه Redis در این مرحله به درستی کار می کند ، مرور میکنیم.
ابتدا بررسی کنید سرویس Redis در حال اجراست:
$ sudo systemctl status redis

اگر بدون خطا در حال اجرا باشد ، این دستور خروجی مشابه زیر را ایجاد می کند:
Output
● redis-server.service – Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 20-06-27 :48:52 UTC; 12s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 2445 (redis-server)
Tasks: 4 (limit: 4704)
CGroup: /system.slice/redis-server.service
└─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .

در اینجا ، می بینید که Redis در حال اجرا فعال شده است ، به این معنی که هر بار که سرور مجازی بوت شود ، راه اندازی می شود.
توجه: این تنظیمات برای بسیاری از موارد استفاده رایج از Redis مطلوب است. اما اگر ترجیح می دهید هر بار که سرور مجازی خود را راه اندازی میکنید ، Redis را به صورت دستی راه اندازی کنید ، می توانید این کار را با دستور زیر تنظیم کنید:
$ sudo systemctl disable redis

برای آزمایش عملکرد صحیح Redis ، با استفاده از کلاینت خط فرمان به سرور مجازی وصل شوید:
$ redis-cli

در اعلان زیر ، اتصال را با دستور ping تست کنید:
127.0.0.1:6379> ping

Output
PONG

این خروجی تأیید می کند که اتصال سرور مجازی هنوز باقی است. در مرحله بعد ، بررسی کنید که می توانید با اجرای دستور زیر، کلیدها را تنظیم کنید:
127.0.0.1:6379> set test It’s working!”

Output
OK
مقدار را با تایپ این دستور بازیابی کنید:
127.0.0.1:6379> get test

با فرض اینکه همه چیز کار می کنید ، می توانید مقدار ذخیره شده خود را بازیابی کنید:
Output
It’s working!”
پس از تأیید این که می توانید مقدار را بدست آورید ، برای بازگشت به پوسته از قسمت Redis خارج شوید:
127.0.0.1:6379> exit

به عنوان یک آزمایش نهایی ، بررسی خواهیم کرد که آیا Redis قادر به حفظ داده حتی پس از متوقف شدن یا راه اندازی مجدد آن هست یا خیر. برای انجام این کار ، ابتدا نمونه Redis را ریستارت کنید:
$ sudo systemctl restart redis

سپس یک بار دیگر با کلاینت خط فرمان ارتباط برقرار کرده و تأیید کنید که مقدار تست شما هنوز در دسترس است:
$ redis-cli

127.0.0.1:6379> get test
مقدار کلید شما هنوز باید در دسترس باشد:
Output
It’s working!”
پس از اتمام دوباره وارد پوسته شوید:
127.0.0.1:6379> exit

با این کار ، نصب Redis شما کاملاً عملیاتی است و برای استفاده شما آماده است. با این حال ، برخی از تنظیمات پیکربندی پیش فرض آن ناایمن است و فرصت حملات و دسترسی به سرور مجازی و داده های آن را می دهد. مراحل باقیمانده در این آموزش ، روش های کاهش این آسیب پذیری ها را مطابق با وب سایت رسمی Redis ارائه میدهد. اگرچه این مراحل اختیاری است و اگر تصمیم به دنبال کردن آنها ندارید ، هنوز هم Redis کار خواهد کرد ، توصیه می شود آنها را انجام دهید تا امنیت سیستم شما بیشتر شود.
مرحله 3 – اتصال به localhost
به طور پیش فرض ، Redis فقط از localhost قابل دسترسی است. با این وجود ، اگر Redis را با پیروی از آموزش دیگری، نصب و پیکربندی کرده اید ، ممکن است فایل پیکربندی را به روز کرده باشید تا بتوانید از هرجای دیگر اتصالات را برقرار کنید. این روش به اندازه کافی برای اتصال به localhost مطمئن نیست.
برای اصلاح این مشکل ، فایل پیکربندی Redis را برای ویرایش باز کنید:
$ sudo nano /etc/redis/redis.conf

این خط را پیدا کرده و اطمینان حاصل کنید که آن باطل است (در صورت وجود # ، آن را حذف کنید):
/etc/redis/redis.conf
bind 127.0.0.1 ::1

پس از اتمام فایل را ذخیره کرده و ببندید (CTRL + X ، Y ، سپس ENTER را فشار دهید).
سپس ، سرویس را مجدداً راه اندازی کنید تا اطمینان حاصل شود که systemd تغییرات شما را خوانده است:
$ sudo systemctl restart redis

برای بررسی اینکه این تغییر به مرحله اجرا گذاشته شده است ، دستور netstat زیر را اجرا کنید:
$ sudo netstat -lnp | grep redis

Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 1422

این خروجی نشان می دهد که برنامه redis-server به localhost (127.0.0.1) متصل شده است و تغییری را که اخیراً در فایل پیکربندی ایجاد کرده اید ، نشان می دهد. اگر آدرس IP دیگری را در آن ستون مشاهده می کنید (به عنوان مثال 0.0.0.0) ، پس باید دوبار بررسی کنید که خط صحیح را باطل کرده اید و دوباره سرویس Redis را راه اندازی کنید.
اکنون که نصب Redis فقط به localhost گوش می کند ، انجام درخواست یا دسترسی به سرور مجازی شما برای حمله گران دشوار خواهد بود. با این حال ، در حال حاضر Redis قبل از ایجاد تغییر در پیکربندی یا داده هایی که نگه میدارد ، از کاربران درخواست نمیکند که خود را تأیید کنند. برای رفع این مشکل ،Redis به شما امکان می دهد تا کاربران را قبل از ایجاد تغییر از طریق کلاینت Redis (redis-cli) با گذرواژه تأیید کنید.
مرحله 4 – پیکربندی رمز عبور Redis
پیکربندی رمز عبور Redis یکی از دو ویژگی امنیتی داخلی خود را ایجاد می کند – دستور auth ، که به تایید اعتبار کلاینت ها برای دسترسی به پایگاه داده نیاز دارد. رمز عبور مستقیماً در فایل پیکربندی Redis ، /etc/redis/redis.conf پیکربندی شده است ، بنابراین دوباره آن فایل را با ویرایشگر مورد نظر خود باز کنید:
$ sudo nano /etc/redis/redis.conf

به بخش SECURITY بروید و به دنبال دستورالعملی باشید که وظیفه خواندن را دارد:
/etc/redis/redis.conf
# requirepass foobared

با حذف # آن را لغو کنید و foobared  را به یک رمزعبور امن تغییر دهید.
توجه: در بالای دستورالعمل requirepass در فایل redis.conf ، یک اخطار کامنت وجود دارد:
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#

بنابراین ، مهم است که یک مقدار بسیار قوی و بسیار طولانی را به عنوان رمزعبور خود تعیین کنید. به جای ایجاد رمز عبور ، می توانید از دستور opensl برای ایجاد پسورد تصادفی استفاده کنید ، مانند مثال زیر. با اتصال خروجی دستور اول به دستور دوم opensl ، همانطور که در اینجا نشان داده شده است ، هرگونه وقفه بین خطوط را که توسط آن دستور اول ایجاد می شود حذف می کند:
$ openssl rand 60 | openssl base64 -A

خروجی شما باید شبیه به چیزی باشد
Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

پس از کپی پیست کردن خروجی آن فرمان به عنوان مقدار جدید requirepass ، باید این را بخواند:
/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

پس از تنظیم گذرواژه ، فایل را ذخیره کرده و ببندید ، و دوباره Redis را ریستارت کنید:
$ sudo systemctl restart redis.service

برای آزمایش اینکه رمز عبور کار می کند ، به خط فرمان Redis دسترسی پیدا کنید:
$ redis-cli

در زیر توالی دستورات مورد استفاده برای تست کار با رمز Redis وجود دارد. دستور اول سعی می کند قبل از تأیید اعتبار ، کلید را روی یک مقدار تنظیم کند:
127.0.0.16379> set key1 10

از آنجا که شما تأیید اعتبار نکردید ، کار نخواهد کرد . بنابراین Redis خطایی را برمی گرداند:
Output
(error) NOAUTH Authentication required.

دستور بعدی با گذرواژه مشخص شده در فایل پیکربندی Redis تأیید اعتبار می کند:
127.0.0.16379> auth your_redis_password

Redis تصدیق می کند:
Output
OK
پس از آن ، اجرای دوباره فرمان قبلی موفق خواهد شد:
127.0.0.16379> set key1 10

Output
OK

get key1 برای دریافت کلید جدید ، از Redis پرس و جو میکند.
127.0.0.16379> get key1

Output
10”

پس از تأیید اینکه می توانید بعد از تأیید اعتبار ، دستوراتی را در کلاینت Redis اجرا کنید ، می توانید از redis-cli خارج شوید:
127.0.0.16379> quit

در مرحله بعد ، تغییر نام دستورات Redis را بررسی خواهیم کرد که اگر به اشتباه یا توسط یک حمله گر وارد شود ، می تواند آسیب جدی به دستگاه شما وارد کند.
مرحله 5 – تغییر نام دستورات خطرناک
ویژگی امنیتی دیگر قرار داده شده در Redis تغییر نام یا غیرفعال کردن کامل فرامین خاصی است که خطرناک به نظر می رسند.
هنگامی که این دستورات توسط کاربران غیرمجاز اجرا می شوند ، می توانند برای پیکربندی ، از بین بردن یا پاک کردن داده های شما استفاده شوند. مانند گذرواژه تأیید اعتبار ، تغییر نام یا غیرفعال کردن دستورات در همان بخش SECURITY فایل /etc/redis/redis.conf پیکربندی شده است.
برخی از دستوراتی که خطرناک به حساب می آیند عبارتند از FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, و  DEBUG.
این یک لیست جامع نیست ، اما تغییر نام یا غیرفعال کردن کلیه دستورات موجود در آن لیست ، نقطه شروع خوبی برای افزایش امنیت سرور مجازی Redis شما است.
این که آیا شما باید یک فرمان را غیرفعال کنید یا تغییر نام دهید ، به نیازهای خاص شما یا نیازهای سایت شما بستگی دارد. اگر می دانید هرگز از دستوری که مورد سوءاستفاده قرار می گیرد استفاده نمی کنید ، می توانید آن را غیرفعال کنید. در غیر این صورت ، تغییر نام آن مفید خواهد بود.
برای فعال یا غیرفعال کردن دستورات Redis ، فایل پیکربندی را یک بار دیگر باز کنید:
$ sudo nano /etc/redis/redis.conf

هشدار: مراحل زیر نشانگر نحوه غیرفعال کردن و تغییر نام دستورات مثال است. شما فقط باید انتخاب کنید که که غیرفعال کردن یا تغییر نام چه دستوراتی منطقی میباشد. می توانید لیست کامل دستورات را برای خود مرور کنید و نحوه استفاده آنها در redis.io/commands را تعیین کنید.

برای غیرفعال کردن یک دستور ، کافی است آن را به یک رشته خالی تغییر دهید (که توسط یک جفت علامت نقل قول بدون هیچ کاراکتری بین آنها مشخص شده است) ، همانطور که در زیر نشان داده شده:
/etc/redis/redis.conf
. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ”
rename-command FLUSHALL ”
rename-command DEBUG ”
. . .
برای تغییر نام یک فرمان ، مانند مثالهای زیر نام دیگری به آن بدهید. حدس دستورات تغییر نام یافته باید برای دیگران دشوار باشد ، اما یادآوری آن برای شما آسان باشد:
/etc/redis/redis.conf
. . .
# rename-command CONFIG ”
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

تغییرات خود را ذخیره کرده و فایل را ببندید.
پس از تغییر نام یک فرمان ، با راه اندازی مجدد Redis ، تغییر را اعمال کنید:
$ sudo systemctl restart redis.service

برای آزمایش دستور جدید ، وارد خط فرمان Redis شوید:
$ redis-cli

سپس ، تأیید اعتبار کنید:
127.0.0.1:6379> auth your_redis_password

Output
OK
فرض کنیم که شما دستور CONFIG را مانند مثال قبل به ASC12_CONFIGتغییر نام دادید . ابتدا سعی کنید از دستور اصلی CONFIG استفاده کنید. باید با شکست مواجه شود ، زیرا شما آن را تغییر نام داده اید:
127.0.0.1:6379> config get requirepass

Output
(error) ERR unknown command ‘config’

با این وجود فراخوانی فرمان تغییر نام داده شده موفقیت آمیز خواهد بود. به کوچک و بزرگ بودن کاراکترها حساس نیست:
127.0.0.1:6379> asc12_config get requirepass

Output
1) requirepass”
2) your_redis_password”

درنهایت ، می توانید از redis-cli خارج شوید:
127.0.0.1:6379> exit

توجه داشته باشید که اگر قبلاً از خط فرمان Redis استفاده کرده اید و دوباره Redis را ریستارت کرده اید ، باید مجددا تأیید اعتبار کنید. در غیر این صورت ، اگر یک دستور تایپ کنید ، این خطا را دریافت خواهید کرد:
Output
NOAUTH Authentication required.

به خاطر تغییر نام دستورات ، در پایان بخش SECURITY در /etc/redis/redis.conf یک عبارت احتیاط وجود دارد:
/etc/redis/redis.conf
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .

توجه: پروژه Redis از اصطلاحات master” و slave” استفاده میکند ، در حالی که vpsgol عموماً اصطلاحات primary” و secondary” را ترجیح می دهد به معنی اولیه و ثانویه.
برای جلوگیری از سردرگمی ، تصمیم گرفتیم که در اینجا از اصطلاحات استفاده شده در مستندات Redis استفاده کنیم.
این بدان معناست که اگر دستور تغییر نام یافته در فایل AOF نباشد ، یا اگر موجود باشد اما فایل AOF به slaves ارسال نشده باشد ، دیگر مشکلی وجود نخواهد داشت.
بنابراین ، هنگام تغییر نام دستورات ، این را به خاطر داشته باشید. بهترین زمان برای تغییر نام یک فرمان زمانی است که شما از ماندگاری AOF استفاده نمی کنید ، یا درست بعد از نصب ، یعنی قبل از استقرار برنامه مبتنی بر Redis.
هنگامی که از AOF استفاده می کنید و با یک نصب master slave سرو کار دارید ، این پاسخ را از صفحه صدور GitHub پروژه در نظر بگیرید.
بنابراین ، بهترین روش برای تغییر نام در مواردی از این دست ، این است که مطمئن شوید دستورات تغییر نام یافته به تمام مثال های نصب های master-slave اعمال میشود.
نتیجه
در این آموزش ، Redis را نصب و پیکربندی کرده اید ، تأیید کردید که نصب Redis شما به درستی کار می کند و از ویژگی های امنیتی داخلی استفاده کرده است تا در برابر حملات مخرب کمتر آسیب پذیر باشد.
به خاطر داشته باشید که پس از ورود شخصی به سرور مجازی شما ، دور زدن ویژگی های امنیتی ویژه Redis که ما در آن قرار داده ایم بسیار آسان است. بنابراین ، مهمترین ویژگی امنیتی در سرور مجازی Redis ، فایروال شماست (که در صورت پیروی از آموزش مقدماتی راه اندازی اولیه سرور مجازی اولیه، آن را پیکربندی کرده اید) ، زیرا این کار پرش از آن حصار امنیتی را برای حمله گران بسیار دشوار می کند.

 

برچسب‌ها:


پشته LAMP” گروهی از نرم افزارهای منبع باز است که به طور معمول به منظور فعال کردن سرور مجازی برای میزبانی وب سایتهای پویا و برنامه های وب که به زبان PHP نوشته شده است ، با هم نصب می شوند. این اصطلاح مخفف سیستم عامل لینوکس دارای سرور مجازی وب Apache است. داده های سایت در یک پایگاه داده MySQL ذخیره می شوند و محتوای پویا توسط PHP پردازش می شود.
در این راهنما ، یک پشته LAMP را روی یک سرور مجازی Ubuntu 20.04 نصب خواهیم کرد.
پیش نیازها
برای تکمیل این آموزش ، نیاز به داشتن یک سرور مجازی اوبونتو 20.04 با یک حساب کاربری غیر ریشه فعال با sudo و یک فایروال پایه دارید که می توان با استفاده از راهنمای تنظیم اولیه سرور مجازی ما برای اوبونتو 20.04 این کار را انجام داد.
مرحله 1 – نصب Apache و به روزرسانی فایروال
وب سرور مجازی Apache از محبوب ترین سرور مجازی های وب در جهان است. به خوبی مستند شده است ، جامعه فعالی از کاربران دارد و در بیشتر تاریخ وب مورد استفاده گسترده قرار گرفته است ، و این باعث می شود آن را به عنوان یک گزینه پیش فرض عالی برای میزبانی وب سایت انتخاب کنیم.
Apache را با استفاده از مدیر بسته Ubuntu یعنی apt نصب کنید:
⦁ $ sudo apt update

⦁ $ sudo apt install apache2

اگر اولین بار است که در این بخش از sudo استفاده می کنید ، از شما خواسته می شود که رمزعبور کاربر خود را ارائه کنید تا تأیید کنید که از امتیازات مناسب برای مدیریت بسته های سیستم با apt برخوردار هستید. از شما خواسته می شود که با فشار دادن Y ، سپس enter نصب Apache را تأیید کنید.
پس از اتمام نصب ، باید تنظیمات فایروال خود را تنظیم کنید تا ترافیک HTTP و HTTPS امکان پذیر باشد. UFW دارای پروفایل های متفاوتی است که می توانید برای دستیابی به این هدف اهرم کنید. برای لیست کردن تمام پروفایل های برنامه UFW موجود ، می توانید این دستور را اجرا کنید:
⦁ $ sudo ufw app list

خروجی مانند این را خواهید دید:
Output
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH

معنی هر یک از این پروفایل ها آورده شده است:
⦁ Apache: این نمایه فقط پورت 80 (ترافیک وب عادی و بدون رمزگذاری) را باز می کند.
⦁ Apache Full: این پروفایل هر دو پورت 80 (ترافیک وب عادی و بدون رمزگذاری) و پورت 443 (ترافیک رمزگذاری شده TLS / SSL) را باز می کند.
⦁ Apache Secure: این نمایه فقط پورت 443 (ترافیک رمزگذاری شده TLS / SSL) را باز می کند.
در حال حاضر ، بهتر است فقط اجازه دسترسی اتصالات در پورت 80 را بدهید ، زیرا این یک نصب جدید Apache است و هنوز گواهی TLS / SSL پیکربندی شده برای اجازه ترافیک HTTPS در سرور مجازی خود ندارید.
فقط برای ترافیک در پورت 80 ، از نمایه Apache استفاده کنید:
⦁ $ sudo ufw allow in Apache”

می توانید تغییر را با این دستور تأیید کنید:
⦁ $ sudo ufw status

Output
Status: active

To Action From
— —— —-
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)

ترافیک پورت 80 اکنون از طریق فایروال مجاز است.
با مراجعه به آدرس IP عمومی سرور مجازی خود در مرورگر وب ، می توانید بلافاصله بررسی را انجام دهید تا تأیید کنید که همه چیز به درستی پیش میرود ( اگر در حال حاضر این اطلاعات را ندارید ، نوشته زیر این عنوان را ببینید تا بفهمید آدرس IP عمومی تان چیست):
http://your_server_ip

صفحه پیش فرض Ubuntu 20.04 Apache را مشاهده می کنید ، که برای اهداف اطلاع رسانی و آزمایشی میباشد. باید چیزی شبیه به این باشد:

اگر این صفحه را مشاهده کردید ، اکنون سرور مجازی وب شما به درستی از طریق فایروال نصب شده و در دسترس است.
چگونه آدرس IP عمومی سرور مجازی خود را پیدا کنید
اگر نمی دانید آدرس IP عمومی سرور مجازی شما چیست ، روش های مختلفی برای یافتن آن وجود دارد. معمولاً آدرسی است که برای اتصال به سرور مجازی خود از طریق SSH استفاده می کنید.
چند روش مختلف برای انجام این کار از خط فرمان وجود دارد. ابتدا می توانید با تایپ دستور زیر از ابزار iproute2 برای دریافت آدرس IP خود استفاده کنید:
⦁ $ ip addr show eth0 | grep inet | awk ‘{ print $2; }’ | sed ‘s/\/.*$//’

این دستور دو یا سه خط قبلی را به شما باز می گرداند. همه آنها آدرس های صحیحی هستند ، اما رایانه شما فقط می تواند از یکی از آنها استفاده کند ، بنابراین هر یک از آنها را امتحان کنید.
روش دیگر استفاده از ابزار curl برای تماس با طرف خارجی است تا به شما بگوید سرور مجازی شما را چگونه مشاهده میکند. این کار با پرسیدن آدرس IP شما از یک سرور مجازی خاص انجام میشود:
⦁ $ curl http://icanhazip.com

صرف نظر از روشی که برای دریافت آدرس IP خود استفاده می کنید ، آن را در نوار آدرس مرورگر وب خود وارد کنید تا صفحه پیش فرض Apache را مشاهده کنید.
مرحله 2 – نصب MySQL
اکنون که وب سرور خود را فعال و راه اندازی کرده اید ، باید سیستم پایگاه داده را نصب کنید تا بتوانید داده های سایت خود را ذخیره و مدیریت کنید. MySQL یک سیستم مدیریت پایگاه داده محبوب است که در محیط های PHP استفاده می شود.
دوباره ، برای به دست آوردن و نصب این نرم افزار از apt استفاده کنید:
⦁ $ sudo apt install mysql-server

در صورت درخواست ، نصب را با تایپ Y و سپس ENTER تأیید کنید.
پس از اتمام نصب ، توصیه می شود اسکریپت امنیتی را اجرا کنید که از طریق MySQL از قبل نصب شده باشد. این اسکریپت برخی از تنظیمات پیش فرض ناامن را حذف کرده و دسترسی به سیستم پایگاه داده شما را غیرفعال می کند. اسکریپت تعاملی را با اجرای این دستور شروع کنید:
⦁ $ sudo mysql_secure_installation

با استفاده از این گزینه می توانید پلاگین Validate PASSWORD را پیکربندی کنید.
توجه: فعال کردن این ویژگی چیزی مثل فراخوانی قضاوت است. در صورت فعال بودن ، گذرواژهای ناسازگار با معیارهای مشخص توسط خطای MySQL رد می شوند. بهتر است اعتبارسنجی را غیرفعال رها کنید ، اما همیشه باید از رمز عبورهای قوی و منحصر به فرد برای اعتبارات پایگاه داده استفاده کنید.

برای بله yes را تایپ کنید و یا هر چیز دیگری که بدون فعال سازی کار را ادامه میدهد.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

اگر yes را جواب بدهید ، از شما خواسته می شود یک سطح اعتبار گذرواژه را انتخاب کنید. به خاطر داشته باشید اگر 2 را برای قویترین سطح وارد کنید ، باید گذرواژه ای شامل اعداد ، حروف بزرگ و کوچک و علائم خاص وارد کنید ، در غیر این صورت خطایی دریافت خواهید کرد.
There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

صرف نظر از این که شما تصمیم به تنظیم PLUGIN VALIDATE PASSWORD گرفته اید ، سرور مجازی از شما درخواست می کند که یک رمز عبور را برای کاربر ریشه MySQL انتخاب و تأیید کنید. این کاربر نباید با کاربر ریشه سیستم اشتباه گرفته شود. کاربر ریشه بانک اطلاعاتی یک کاربر ادمین با امتیازات کامل برای دسترسی به سیستم دیتابیس است. حتی اگر روش احراز هویت پیش فرض برای کاربر ریشه MySQL ، استفاده از یک رمزعبور را نادیده می گیرد ، حتی اگر پسوردی تنظیم شده باشد ، باید یک رمزعبور قوی را در اینجا به عنوان یک اقدام امنیتی اضافی تعریف کنید. به صورت مختصر به این مورد خواهیم پرداخت.
اگر اعتبار سنجی رمز عبور را فعال کرده باشید ، قدرت رمز عبور برای رمز ریشه که تازه وارد کرده اید به شما نشان داده می شود و سرور مجازی تان از شما سؤال می کند که آیا می خواهید با آن رمز عبور ادامه دهید یا خیر. اگر از گذرواژه فعلی خود راضی هستید ، yes” را وارد کنید:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
برای بقیه سؤالات ، Y را فشار داده و در هر اعلان کلید ENTER را بزنید. با این کار برخی از کاربران ناشناس و بانک اطلاعاتی آزمایشی حذف می شوند ، ورود به سیستم ریشه از راه دور غیرفعال می شود و این قوانین جدید بارگذاری می شوند تا MySQL فوراً با تغییراتی که ایجاد کرده اید منطبق شود.
پس از اتمام ، می توانید با تایپ دستور زیر بررسی کنید که آیا میتوانید به کنسول MySQL وارد شوید:
⦁ sudo mysql

با این کار به سرور مجازی MySQL به عنوان کاربر ریشه پایگاه داده ادمین متصل می شوید ، که با استفاده از sudo هنگام اجرای این دستور استنباط می شود. باید خروجی مانند این را مشاهده کنید:
Output
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

برای خروج از کنسول MySQL ، این دستور را تایپ کنید:
mysql> exit

توجه کنید که لازم نیست برای اتصال به عنوان کاربر اصلی ، گذرواژه ارائه کنید ، حتی اگر هنگام اجرای اسکریپت mysql_secure_installation ، پسوردی تعریف کرده باشید. این بدان دلیل است که روش تأیید اعتبار پیش فرض برای کاربر MySQL ادمین به جای رمز عبور، روش unix_socket است. حتی اگر ممکن است این مسئله در ابتدا یک نگرانی امنیتی به نظر برسد ، باعث می شود سرور مجازی پایگاه داده ایمن تر شود زیرا تنها کاربرانی که اجازه ورود به عنوان کاربر ریشه MySQL را دارند ، کاربران سیستم با امتیازات sudo هستند که از طریق کنسول یا برنامه ای با همان امتیازات ، وارد سیستم می شوند. در عمل ، این بدان معناست که شما قادر نخواهید بود از کاربر ریشه پایگاه داده ادمین برای اتصال به برنامه PHP خود استفاده کنید. در صورت تغییر روش احراز هویت پیش فرض از unix_socket به رمز عبور، تنظیم گذرواژه برای حساب ریشه MySQL به عنوان محافظ عمل می کند.
برای افزایش امنیت ، بهتر است برای هر بانک اطلاعاتی ، حسابهای کاربری اختصاصی با امتیازات گسترده تری تنظیم کنید ، به خصوص اگر قصد دارید چندین پایگاه داده را در سرور مجازی خود داشته باشید.
توجه: در زمان نوشتن این راهنما، کتابخانه بومی MySQL PHP ، یعنی mysqlnd از caching_sha2_authentication، روش احراز هویت پیش فرض برای MySQL 8، پشتیبانی نمی کند. به همین دلیل ، هنگام ایجاد کاربران دیتابیس برای برنامه های PHP در MySQL 8 ، باید مطمئن باشید که به گونه ای پیکربندی کرده اید که به جای آن از mysql_native_password استفاده کنند. ما در مرحله 6 نحوه انجام این کار را نشان خواهیم داد.

سرور مجازی MySQL شما اکنون نصب و ایمن شده است. در مرحله بعد ، PHP ، مؤلفه نهایی را در پشته LAMP نصب خواهیم کرد.
مرحله 3 – نصب PHP
شما Apache را برای ارائه خدمات خود و MySQL را برای ذخیره سازی و مدیریت داده های خود نصب کرده اید. PHP مؤلفه ای از ستاپ ما است که کد را برای نمایش محتوای پویا به کاربر نهایی پردازش می کند. علاوه بر بسته php ، به php-mysql ، یک ماژول PHP نیاز خواهید داشت که به PHP اجازه می دهد تا با بانکهای اطلاعاتی مبتنی بر MySQL ارتباط برقرار کند. برای فعال سازی Apache برای مدیریت فایل های PHP ، به libapache2-mod-php نیز نیاز خواهید داشت. بسته های اصلی PHP بصورت خودکار به عنوان متعلقات نصب می شوند.
برای نصب این بسته ها ، این دستور را اجرا کنید:
⦁ $ sudo apt install php libapache2-mod-php php-mysql

پس از اتمام نصب ، می توانید دستور زیر را برای تأیید نسخه PHP خود اجرا کنید:
⦁ $ php -v

Output
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

در این مرحله ، پشته LAMP شما کاملاً عملیاتی است ، اما قبل از اینکه بتوانید تنظیمات خود را با یک اسکریپت PHP تست کنید ، بهتر است یک هاست مناسب Apache Virtual را برای نگهداری فایل ها و پوشه های وب سایت خود تنظیم کنید. ما این کار را در مرحله بعدی انجام خواهیم داد.
مرحله 4 – ایجاد یک هاست مجازی برای وب سایت خود
هنگام استفاده از وب سرور مجازی Apache ، می توانید هاست های مجازی (مشابه بلوک های سرور مجازی در Nginx) ایجاد کنید تا جزئیات پیکربندی را کپسوله کنید و هاست بیش از یک دامنه از یک سرور واحد باشید. در این راهنما دامنه ای به نام your_domain تنظیم خواهیم کرد ، اما شما باید آن را با نام دامنه خود جایگزین کنید.
Apache در Ubuntu 20.04 دارای یک بلوک سرور مجازی است که بصورت پیش فرض فعال شده است تا برای ارائه اسناد از دیرکتوری / var / www / html پیکربندی شود. اگرچه برای این یک سایت واحد به خوبی کار می کند ، اما اگر هاست چندین سایت باشید ، می تواند مشکل ساز شود. به جای اصلاح / var / www / html ، یک ساختار دایرکتوری را در / var / www برای سایت your_domain ایجاد خواهیم کرد ، و / var / www / html را در جای خود به عنوان دایرکتوری پیش فرض قرار می دهیم که در صورتی که درخواست کلاینت با هیچ یک از سایت ها منطبق نبود، ارائه شود.
دایرکتوری برای your_domain را به شرح زیر ایجاد کنید:
⦁ $ sudo mkdir /var/www/your_domain

در مرحله بعد ، مالکیت دایرکتوری را به متغیر محیط $USER اختصاص دهید ، که کاربر فعلی سیستم شما را ارجاع خواهد داد:
⦁ $ sudo chown -R $USER:$USER /var/www/your_domain

سپس ، با استفاده از ویرایشگر خط فرمان مورد نظر خود ، یک فایل پیکربندی جدید در دیرکتوری sites-available Apache باز کنید. در اینجا ، ما از nano استفاده خواهیم کرد:
⦁ $ sudo nano /etc/apache2/sites-available/your_domain.conf

با این کار یک فایل جدید خالی ایجاد می شود. پیکربندی بدون اسکلت زیر را در آن قرار دهید:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

پس از اتمام کار فایل را ذخیره کنید و ببندید. اگر از nano استفاده میکنید میتوانید با فشردن CTRL+X سپس Yو ENTERاین کار را انجام دهید.
با استفاده از این پیکربندی VirtualHost ، به Apache می گوییم تا با استفاده از / var / www / your_domain به عنوان دایرکتوری ریشه وب ، به your_domain سرویس دهی کند. اگر می خواهید Apache را بدون نام دامنه تست کنید ، می توانید با اضافه کردن یک کاراکتر # در ابتدای خطوط هر گزینه ، گزینه های ServerName و ServerAlias ​​را حذف یا اضافه کنید.
اکنون می توانید از a2ensite برای فعال کردن هاست مجازی جدید استفاده کنید:
⦁ $ sudo a2ensite your_domain

ممکن است بخواهید وب سایت پیش فرض نصب شده با Apache را غیرفعال کنید. در صورت عدم استفاده از نام دامنه سفارشی لازم نیست زیرا در این حالت پیکربندی پیش فرض Apache باعث می شود هاست مجازی شما بازنویسی شود. برای غیرفعال کردن وب سایت پیش فرض Apache ، این دستور را تایپ کنید:
⦁ $ sudo a2dissite 000-default

برای اطمینان از اینکه فایل پیکربندی شما حاوی خطاهای نحوی نیست ، اجرا کنید:
⦁ $ sudo apache2ctl configtest

در آخر ، Apache را مجدد لود کنید تا این تغییرات به مرحله اجرا درآیند:
⦁ $ sudo systemctl reload apache2

وب سایت جدید شما اکنون فعال است ، اما ریشه وب / var / www / your_domain هنوز خالی است. یک فایل index.html در آن مکان ایجاد کنید تا بتوانیم آزمایش کنیم که هاست مجازی مطابق آنچه انتظار می رود کار میکند:
⦁ $ nano /var/www/your_domain/index.html

محتوای زیر را در این فایل وارد کنید:
/var/www/your_domain/index.html
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>

<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>

اکنون به مرورگر خود بروید و یک بار دیگر به نام دامنه یا آدرس IP سرور مجازی خود دسترسی پیدا کنید:
http://server_domain_or_IP

صفحه ای را به این شکل مشاهده خواهید کرد:

اگر این صفحه را مشاهده کردید ، به این معنی است که هاست مجازی Apache شما مطابق آنچه انتظار می رود کار می کند.
می توانید تا زمانی که یک فایل index.php تنظیم کنید تا جایگزین آن شود ، این فایل را به صورت یک صفحه فرود موقت برای برنامه خود باقی بگذارید. پس از انجام این کار ، به یاد داشته باشید که فایل index.html را از ریشه سند خود حذف یا تغییر نام دهید ، زیرا به طور پیش فرض بر یک فایل index.php پیشی می گیرد.
نکته ای درباره DirectoryIndex در Apache
با تنظیمات پیش فرض DirectoryIndex در Apache ، فایلی با نام index.html همیشه بر فایل index.php اولویت خواهد داشت. این ویژگی برای ایجاد صفحات نگهداری در برنامه های PHP ، با ایجاد یک فایل موقت index.html حاوی یک پیام آموزنده برای بازدید کنندگان ، مفید است. از آنجا که این صفحه بر صفحه index.php ارجحیت دارد ، سپس به صفحه فرود برنامه تبدیل خواهد شد. پس از اتمام نگهداری، index.html تغییر نام داده یا از ریشه سند خارج می شود و صفحه برنامه معمولی را برمی گرداند.
اگر می خواهید این رفتار را تغییر دهید ، باید فایل /etc/apache2/mods-enabled/dir.conf را ویرایش کرده و نظمی را که در آن دیرکتوری index.php در دستورالعمل DirectoryIndex ذکر شده است اصلاح کنید:
⦁ $ sudo nano /etc/apache2/mods-enabled/dir.conf

/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

پس از ذخیره و بستن فایل ، باید Apache را مجدد لود کنید تا تغییرات به مرحله اجرا در بیایند:
⦁ $ sudo systemctl reload apache2

در مرحله بعد ، ما یک اسکریپت PHP ایجاد خواهیم کرد تا آزمایش کنیم که PHP به درستی روی سرور مجازی شما نصب شده و پیکربندی شده است.
مرحله 5 – تست پردازش PHP در وب سرور مجازی خود
اکنون که یک مکان سفارشی برای میزبانی فایل ها و پوشه های وب سایت خود دارید ، یک اسکریپت تست PHP ایجاد خواهیم کرد تا تأیید کند که Apache قادر به مدیریت و پردازش درخواست های فایل های PHP است.
یک فایل جدید با نام info.php را در پوشه ریشه وب سفارشی خود ایجاد کنید:
⦁ $ nano /var/www/your_domain/info.php

این دستور یک فایل خالی را باز می کند. متن زیر را که کد PHP معتبر است ، داخل فایل اضافه کنید:
/var/www/your_domain/info.php
<?php
phpinfo();

پس از اتمام ، فایل را ذخیره کنید و ببندید.
برای تست این اسکریپت ، به مرورگر وب خود بروید و به نام دامنه یا آدرس IP سرور مجازی خود ، که پس از آن نام اسکریپت وجود دارد دسترسی پیدا کنید ، که در این حالت info.php است:
http://server_domain_or_IP/info.php
صفحه ای شبیه به این را مشاهده خواهید کرد:

این صفحه اطلاعاتی را در مورد سرور مجازی شما از منظر PHP ارائه می دهد که برای اشکال زدایی مفید است و اطمینان حاصل میکند که تنظیمات شما به درستی اعمال می شوند.
اگر می توانید این صفحه را در مرورگر خود مشاهده کنید ، نصب PHP شما مطابق آنچه انتظار می رود کار می کند.
پس از بررسی اطلاعات مربوط به سرور مجازی PHP خود از طریق آن صفحه ، بهتر است فایل ایجاد شده را حذف کنید زیرا حاوی اطلاعات حساسی در مورد محیط PHP شما و سرور مجازی Ubuntu شماست. برای این کار می توانید از rm استفاده کنید:
⦁ $ sudo rm /var/www/your_domain/info.php

در صورت نیاز به دسترسی مجدد به اطلاعات ، همیشه می توانید این صفحه را مجدداً ایجاد کنید.
مرحله 6 – آزمایش اتصال به بانک اطلاعاتی از PHP (اختیاری)
اگر می خواهید تست کنید که آیا PHP قادر به اتصال به MySQL و اجرای پرس و جوهای پایگاه داده است، می توانید یک جدول آزمایشی با داده های ساختگی و جستجوی مطالب آن از یک اسکریپت PHP ایجاد کنید. قبل از اینکه بتوانیم این کار را انجام دهیم ، باید یک پایگاه داده آزمایشی و یک کاربر جدید MySQL برای دسترسی به آن را به درستی پیکربندی کنیم.
در زمان نوشتن این مقاله، کتابخانه بومی MySQL PHP ، mysqlnd از caching_sha2_authentication، روش تأیید اعتبار پیش فرض برای MySQL 8 پشتیبانی نمی کند. برای اینکه بتوانیم از PHP به آن متصل شویم ، نیاز به ایجاد کاربر جدید با تایید اعتبار mysql_native_password داریم.
یک دیتابیس با نام example_database و کاربری با نام example_user ایجاد خواهیم کرد ، اما می توانید این نام ها را با مقادیر مختلف جایگزین کنید.
ابتدا با استفاده از حساب ریشه به کنسول MySQL وصل شوید:
⦁ $ sudo mysql

برای ایجاد یک پایگاه داده جدید ، دستور زیر را از کنسول MySQL خود اجرا کنید:
⦁ mysql> CREATE DATABASE example_database;

اکنون می توانید یک کاربر جدید ایجاد کنید و در پایگاه داده سفارشی که اخیراً ایجاد کرده اید ، به آنها امتیاز دهید.
دستور زیر با استفاده از mysql_native_password به عنوان یک روش تأیید اعتبار پیش فرض کاربر جدیدی به نام example_user ایجاد می کند. ما رمزعبور این کاربر را به عنوان PASWORD تعریف می کنیم ، اما شما باید این مقدار را با یک رمز عبور مطمئن به انتخاب خود جایگزین کنید.
⦁ mysql> CREATE USER ‘example_user’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’;

اکنون باید به این کاربر اجازه به پایگاه داده example_database را بدهیم:
⦁ mysql> GRANT ALL ON example_database.* TO ‘example_user’@’%’;

این کار به کاربر example_user دسترسی کامل به بانک اطلاعاتی example_database را می دهد ، در حالی که از ایجاد یا تغییر سایر پایگاه های داده روی سرور مجازی شما جلوگیری می کند.
اکنون از پوسته MySQL خارج شوید:
⦁ Mysql> exit

با ورود دوباره به کنسول MySQL ، این بار با استفاده از اعتبار کاربر سفارشی می توانید آزمایش کنید که آیا کاربر جدید دارای مجوزهای مناسب است.
⦁ $ mysql -u example_user -p

در این دستور ، به پرچم -p توجه کنید ، که رمز عبوری که در هنگام ایجاد کاربر example_user استفاده کردید را از شما میخواهد. پس از ورود به کنسول MySQL ، تأیید کنید که به بانک اطلاعاتی example_database دسترسی دارید:
⦁ Mysql> SHOW DATABASES;

این کار خروجی زیر را به شما می دهد:
Output
+——————–+
| Database |
+——————–+
| example_database |
| information_schema |
+——————–+
2 rows in set (0.000 sec)

در مرحله بعد ، یک جدول آزمایشی با نام todo_list ایجاد خواهیم کرد. از کنسول MySQL عبارت زیر را اجرا کنید:
⦁ Mysql> CREATE TABLE example_database.todo_list (

⦁ Mysql> item_id INT AUTO_INCREMENT,

⦁ Mysql> content VARCHAR(255),

⦁ Mysql> PRIMARY KEY(item_id)

⦁ Mysql> );

چند ردیف محتوا را در جدول آزمون وارد کنید. ممکن است بخواهید با استفاده از مقادیر مختلف دستور بعدی را چند بار تکرار کنید:
⦁ Mysql> INSERT INTO example_database.todo_list (content) VALUES (My first important item”);

برای تأیید اینکه داده ها با موفقیت در جدول شما ذخیره شده اند ، اجرا کنید:
⦁ Mysql> SELECT * FROM example_database.todo_list;

خروجی زیر را مشاهده خواهید کرد:
Output
+———+————————–+
| item_id | content |
+———+————————–+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+———+————————–+
4 rows in set (0.000 sec)

پس از تأیید اینکه داده های معتبری در جدول آزمون خود دارید ، می توانید از کنسول MySQL خارج شوید:
Mysql> exit
اکنون می توانید اسکریپت PHP را ایجاد کنید که به MySQL متصل شود و محتوای شمار را پرس و جو کنید. با استفاده از ویرایشگر مورد نظر خود ، یک فایل PHP جدید را در دیرکتوری ریشه وب خود ایجاد کنید. ما برای این کار از nano استفاده خواهیم کرد:
⦁ $ nano /var/www/your_domain/todo_list.php

اسکریپت PHP زیر به پایگاه داده MySQL متصل میشود و برای محتوای جدول todo_list پرس و جو میکند و نتایج را در یک لیست نمایش می دهد. اگر در ارتباط با بانک اطلاعاتی مشکلی وجود داشته باشد ، یک استثنا به وجود می آورد.
این محتوا را در متن todo_list.php کپی کنید:
/var/www/your_domain/todo_list.php
<?php
$user = example_user”;
$password = password”;
$database = example_database”;
$table = todo_list”;

try {
$db = new PDO(mysql:host=localhost;dbname=$database”, $user, $password);
echo <h2>TODO</h2><ol>”;
foreach($db->query(SELECT content FROM $table”) as $row) {
echo <li>” . $row[‘content’] . </li>”;
}
echo </ol>”;
} catch (PDOException $e) {
print Error!: ” . $e->getMessage() . <br/>”;
die();
}

پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.
اکنون می توانید با مراجعه به نام دامنه یا آدرس IP عمومی که برای وب سایت شما پیکربندی شده و پس از آن /todo_list.php نوشته شده، به این صفحه در مرورگر وب خود دسترسی پیدا کنید :
http://your_domain_or_IP/todo_list.php

باید صفحه ای مانند این را مشاهده کنید ، که محتویاتی را که در جدول آزمایش خود وارد کرده اید نشان دهد:

این بدان معناست که محیط PHP شما آماده اتصال و تعامل با سرور مجازی MySQL است.
نتیجه
در این راهنما ، ما با استفاده از Apache به عنوان سرور مجازی وب و MySQL به عنوان سیستم پایگاه داده ، پایه ای انعطاف پذیر برای ارائه وب سایت ها و برنامه های PHP به بازدید کنندگان شما ایجاد کرده ایم.
به عنوان مرحله فوری بعدی ، باید با ارائه اتصالات از طریق HTTPS اطمینان حاصل کنید که اتصالات به سرور مجازی وب شما ایمن هستند. به منظور تحقق این امر ، می توانید از Let’s Encrypt برای امنیت سایت خود با مجوز TLS / SSL رایگان استفاده کنید.

 

برچسب‌ها:


تبلیغات

آخرین ارسال ها

آخرین جستجو ها

مسلم مراد سوالاتی که همیشه در آزمون نمونه سوالات فلش مکس می آید 29drama شرکت بازرگانی تجاری چرو دل نوشته های یک نوجوان روانشناس پیش از ازدواج know عرضه و مشاوره رایگان خرید با کیفیت ترین انواع بُخور (رطوبت ساز) خرید ویلا در نوشهر وبلاگ ثبت پایتخت