پشتیبان(بکاپ) گیری از سرور، راه حل مطمئن و رایگان

مقدمه

امروزه خیلی از کسب‌وکارهای استارتاپی وابسته به سایتی هست که خدمات اون استارتاپ از اون سایت برای عموم مردم ارایه می‌شود. داده‌های موجود روی سرور اصلی برای استارتاپ‌ها بسیار مهم است. این داده‌ها می‌تواند اطلاعات حساب کاربری افراد شامل سفارش‌ها، هویت کاربر و … باشد. از طرفی داده‌های خود استارتاپ‌ها مانند اطلاعات کالاهایی که توی سایت ثبت شده (به عبارتی محتوای سایت) و مواردی از این دست خیلی مهم هست. از بین رفتن این داده‌ها به دلایل مختلف(!) ضرر‌های زیادی برای شرکت‌ها داره. حتی در بعضی موارد ممکنه نیاز بشه که سریعا سرور را تعویض کنید. مثل ما که از سرویس‌های VPS شرکت افرانت راضی نبودیم و به سرویس‌های شرکت Leaseweb کوچ کردیم. بنابراین یک راه حل خیلی ساده نیاز داشتیم که کل سایت را درجا copy/paste کنیم روی سرور جدید در کمتر از ۵دقیقه تاخیر! یکی از وظایف من این بود که یک سیستم پشتیبانی(بکاپ) بسازم که قابلیت‌های زیر رو داشته باشه:

· بکاپ(Backup) از سایت داشته باشد.

· بکاپ‌ در هر بار از کل سایت گرفته شود. نسخه‌های افزایشی(Incremental) گاهی‌ اوقات در بازگردانی دچار مشکل می‌شوند، به طوری که ساخت مجدد محتوا بهتر از ریکاوری آنها ‌هست.

· هیچ پولی برای اینکار پرداخت نشود.

· داده‌ها در جایی نگه‌داری شود که نگران از بین رفتن داده‌ها نباشیم.

· راه‌حل باید بدون صرف هزینه باشد.

· ورود به panel باید بسیار امن باشد. چون کل داده‌ها یکجا ذخیره می‌شود و لو رفتن آنها تبعات بسیار ناگواری در پی دارد!

· طوری داده‌ها در بکاپ ذخیره شود، که سرویس‌دهنده ذخیره فایل از داده‌ها سؤاستفاده نکند. به عبارتی روی محتوای فایل‌های شما جاسوسی نکند.

به شما خواننده گرامی توصیه می‌شود چنانچه تمایل به درک ساختار مهندسی این روش بکاپ‌گیری ندارید، مستقیما به سراغ بخش آخر که نحوه‌ پیاده‌سازی را تشریح کرده است، بروید. اما اگر خواهان یادگیری ساختار روش بکاپ هستید، کل متن را با دقت بخوانید. برای ادامه کلیک کنید.

نیازسنجی Backup و راهکار ایده‌آل

اول که نیاز به بکاپ برای استارتاپ ما‌ (Wegobazaar.com) خیلی حاد بود خیلی سریع از سیستم پشتیبان‌گیری Bacula استفاده کردیم. بعد متوجه ۲تا مشکل خیلی اساسی شدیم:

o یکی اینکه خود سروری که اطلاعات بکاپ توی اون ذخیره می‌شد، ممکن بود اطلاعاتش پاک بشه و به عبارتی خودش نیاز به بکاپ داشت!!!

o ما برای این سرور هزینه پرداخت می‌کردیم، که خیلی ایده آل ما نبود.

o امکان داشت خود سرور بکاپ مورد حمله قرار بگیرد و داده‌ها افشا شود. ما واقعا داده‌هامون خیلی حساس هست! اصلا نمیخواستم در این مورد احساس خطر بکنم.

بعد از اینکه صاحب یک سیستم نه‌چندان امن برای بکاپ شدیم، حالا با خیال راحت به این موضوع فکر می‌کردیم که چطوری می‌توانیم بازم امنیت این سیستم‌ را بهبود بدیم(هنوز هزینه برای ما مشکل‌ساز نشده بود). در نهایت بعد از کلی تحقیق تونستم روشی رو ابداع کنم که ویژگی‌های زیر رو داشته باشه:

· بکاپ از سایت داشته باشد. ->اینکه اصلا هیچی!

· بکاپ‌ در هر بار از کل سایت گرفته شود. نسخه‌های افزایشی(Incremental) گاهی‌ اوقات در بازگردانی چار مشکل می‌شوند، به طوری که ساخت مجدد محتوا بهتر از ریکاوری آنها ‌هست.

· هیچ پولی برای اینکار پرداخت نشود. -> طوری تنظیم شد که در هربار از کل سایت بکاپ گرفته شود.

· داده‌ها در جایی نگه‌داری شود که نگران از بین رفتن داده‌ها نباشیم. -> برای اینکار گوگل درایو را انتخاب کردیم!

· راه‌حل باید بدون صرف هزینه باشد. -> گوگل درایو تا سقف ۱۵گیگابایت فضای رایگان به کاربران می‌دهد. البته یک اشکالی در سیستم ذخیره سازی گوگل پیدا کردم که می‌توانیم حتی بیشتر از ۱۵گیگابایت ذخیره کنیم بدون اینکه پول بدیم! اما چون این روش غیرقانونی هست نمیشه اینجا نوشت.

· ورود به panel باید بسیار امن باشد. چون کل داده‌ها یکجا ذخیره می‌شود و لو رفتن آنها تبعات بسیار ناگواری در پی دارد! -> وارد شدن به حساب‌کاربری توی گوگل درایو با رمز دوم تنظیم می‌شود(منظورمان همان سیستم 2-Step Authentication هست).

· طوری داده‌ها در بکاپ ذخیره شود، که سرویس‌دهنده ذخیره فایل از داده‌ها سؤاستفاده نکند. به عبارتی روی محتوای فایل‌های شما جاسوسی نکند. -> روی داده‌ها اول یک برنامه فشرده‌سازی اعمال کردیم، بعدش با الگوریتم AES256 که بسیار بسیار امن هست رمزگذاری کردیم.

· پهنای باند زیادی از سرور مصرف نشود(تا جای ممکن سریع هم بکاپ تمام شود) و حجم زیاد بکاپ مارا مجبور نکند که از سیستم‌های تجاری و پولی استفاده کنیم. -> استفاده کردن از الگوریتم‌های فشرده‌سازی بسیار قوی در لینوکس.

· وجود حداقل ۱۰۰ نسخه از اخرین بکاپ‌هایی که گرفته می‌شود، که در صورت نیاز به هرکدام که خواستید بتوانید بازگردید. -> اینکار خودکار توسط گوگل انجام می‌شود.

 

تشریح سیستم بکاپ، مزایا و مراحل بکاپ

          در نهایت توانستم روشی را ابداع کنم که بکاپ همه ویژگی‌های فوق را داشته باشد. این روش برای ما خیلی خوشحال کننده‌ هست. چون هرچقدر میخواستیم میتونیم بکاپ بگیریم و روی گوگل درایو بزارم. اصلا نگران این نیستیم که ممکنه هارد سرور گوگل بسوزد یا از بین برود. همچنین اصلا نگران این نیستیم که داده‌ها مورد حمله قرار بگیره و ازشون سؤاستفاده بشه. چون رمز دومی که برای ورود به حساب گوگل مورد نیاز هست رو هکرها بهش دسترسی ندارن، پس خیالمون راحت هست. همچین داده‌ها را ما طوری رمزنگاری کردیم، که گوگل به هیچ وجه نتواند آنها را باز کند و مورد تجزیه و تحلیل قراردهد.

 

فاز اول بکاپ‌گیری(تهیه فشرده‌کردن فایل‌های حساس برای تهیه پشتیبان):

          در این روشی که عرض شد خدمت شما، ما اول همه‌ی مسیرهای بحرانی سیستم را مشخص کردیم. یعنی تعیین شد کدام مسیر در فایل‌سیستم حاوی داده‌های ارزشمند هست. شما هم باید برای خودتان اینکارو را بکنید. بعد از اینکه مشخص شد، حالا داده‌های اون مسیر رو فشرده با حداکثر قدرت فشرده کردیم. منظور من استفاده از الگوریتم‌های tar.gz هست. این الگوریتم‌های فشرده‌سازی دو مرحله دارد:

1. در مرحله اول ابتدا همه‌ی فایل‌های دایرکتوری موردنظر شما(فایل‌های دایرکتوری مورد نظرتان+همه‌ی فایل‌های زیر دایرکتوری) را در یک فایل می‌نویسد به اینکار tar کردن گفته می‌شود. اینکار هم ۲دلیل دارد:

I. مرحله بعدی الگوریتم که فشرده‌سازی فایل است، با یک فایل سروکار دارد و پیچیدگی کار با چند فایل را ندارد.

II. اینکار خود به خود حجم نهایی را کاهش می‌دهد بدون اینکه فشرده‌سازی اعمال شود. به عنوان مثال اگر ۳فایل را با tar کنیم، و حجم هرکدام x1, x2, x3 باشد، حجم نهایی حتما کمتر از x1 + x2 + x3 خواهد بود. برای فهمیدن دلیل این موضوع باید ساختار فایل سیستم و نحوه ذخیره‌سازی فایل‌ها روی دیسک آشنا باشید(راهنمایی: نوشتن ۳فایل روی یک فایل باعث می‌شود آخرین بلوک نیمه خالی هر فایل حذف شود و در نهایت فقط یک بلوک نیمه خالی داشته باشیم که اگه سایز بلوک‌ها ۴کیلوبایت باشد، حداکثر هدر رفت ما ۴کیلوبایت است. ولی درحالتی که ۳فایل داشته باشیم، حداکثر هدر رفت ۱۲کیلوبایت خواهد بود). اینکار وقتی تعداد‌ فایل‌ها زیاد باشد، بسیار زیاد حجم فایل نهایی را کم می‌کند(که عموما فایل‌های یک وب‌سرور هم تعداد زیادی دارد).

2. در مرحله دوم یک فایل داریم که concat  شده‌ی همه‌ی فایل‌ها است. حالا باید الگوریتم فشرده‌سازی gz را اعمال کنیم. این الگوریتم در ۲ روش فایل‌ها را فشرده می‌کند:

I. یا از الگوریتم LZ0-Compression استفاده می‌کند. این الگوریتم ابتدا بخش‌های تکرای متن را حذف می‌کند و فقط یک‌بار آنها را می‌نویسد. سپس یک الگوریتم مشابه کد هافمن اعمال می‌کند تا بازهم حجم فایل‌ها را کاهش دهد.

II. یا از الگوریتم کدهای هافمن استفاده می‌شود. که این روش دیگر منسوخ شده و فقط در موارد خاص که در پست‌های بعدی در مورد آن نوشته خواهد شود استفاده می‌شود تا کاربرد حیرت‌انگیز آن را ببینید.

 

فاز دوم بکاپ گیری(ذخیره‌کردن تمام اطلاعات پایگاه داده در یک فایل):

          در این مرحله باید از پایگاه داده‌های خود نسخه پشتیبان تهیه کنید و در قالب قابل بازگشت برای پایگاه داده خود ذخیره کنید. برای اینکار باتوجه به بخش تشریح فنی سیستم می‌توانید به راحتی با یک دستور خط فرمان(دستور ترمینال) تمام پایگاه‌ داده‌های سیستم را خروجی بگیرید و داخل مسیر جاری کنار سایر فایل های فشرده‌شده ذخیره کنید. ما برای خودمان این فایل رو فشرده نمی‌کنیم، چون حجیم نیست. ولی شما اگه خواستید می‌توانید همه‌ی مراحل فوق را برای آن انجام دهید.

 

فاز سوم بکاپ‌گیری(رمزگذاری رو فایل‌ها به منظور ایجاد محرمانگی):

اکنون ما یک فایل فوق فشرده‌شده داریم که حاوی کلیه اطلاعات  مسیر مورد نظر ما هست. برای همه‌ی مسیرهای حیاتی سرور تان از این فایل‌ها تهیه کنید. حال در این مرحله باید این فایل را رمز‌گذاری کنیم. پیشنهاد بنده به شما این است که به سواد رمزنگاری بنده اعتماد کنید و از تنظیماتی که برای رمزنگاری فایل پیشنهاد می‌کنم عیننا استفاده کنید تا خطری متوجه داده‌های شما نشود. مشخصات سیستم رمزنگاری پیشنهادی بنده:

1. الگوریتم: AES

2. نسخه الگوریتم: 256bit

3. حالت زنجیره: Cipher Block Chaining (CBC)

4. بردارد اولیه الگوریتم: در مورد IV از حالت پیش‌فرض openssl استفاده ‌کنید.

 

فاز چهارم بکاپ گیری(آپلود فایل‌های بکاپ روی سرور گوگل برای نگهداری بکاپ):

          فایل مورد نظر را از طریق خط فرمان (Command Line) در گوگل درایو با token داده‌شده، آپلود کنید. اینکار به راحتی قابل انجام است.

 

فاز پنجم بکاپ‌گیری(تنظیم زمان‌بند سیستم برای خودکار کردن مراحل فوق):

          خودکار کردن مراحل اول تا سوم پیشنهادی به طوری که به صورت دوره‌ای در زمان‌های دلخواه انجام شود. شما می‌توانید تنظیم کنید در هر ساعت، در هر ۲ساعت، در هر روز و … اینکار انجام شود.

 

فاز ششم بکاپ گیری(!):

          یک لیوان گل‌گاو زبان برای رفع خستگی دم ‌و نوش جان کنید و در آرامش خاطر به خدا عشق بورزید و به زندگی خود ادامه دهید

 

 

تشریح پیاده سازی فنی سیستم بکاپ گیری:

توجه: در هر مرحله باتوجه به اینکه دستورات روی سرور اصلی اجرا می‌شود، دقت کنید که هیچ اشتباهی رخ ندهد. هر اشتباهی که در این فرآیند رخ دهد مسئولیت آن به عهده شماست و وجود هر نقصی در روش پیشنهادی، کاملا به عهده شماست و زیانی متوجه نویسنده این مطلب نخواهد بود.

· ابتدا باید تمام مسیر‌های مورد نظر در فایل‌سیستم را مشخص کنید که داده‌های حساس شما در آن مسیر قرار دارد. به عنوان مثال من یک مسیر را پیشنهاد می‌دهدم و تا پایان کار با داده‌های این مسیر سروکار خواهیم داشت. مسیر پیشنهادی بنده: /home/repozitor/Desktop/ می‌باشد که حاوی کلیه داده‌های وب‌سایت و … می‌باشد.

· داده‌های موجود در مسیر مشخص شده را ابتدا tar کنید و سپس gz کنید. برای اینکار می‌توانید از دستور زیر استفاده کنید:

#cd /home/repozitor/

#tar czpvf siteData.tar.gz /home/repozitor/Desktop/

 

·        از همه‌ی داده‌های موجود در پایگاه داده نسخه پشتیبان تهیه کنید. برای اینکار توصیه می‌شود از همه‌ی پایگاه‌های داده در فایل نسخه پشتیبان بگیرید:

#mysqldump –defaults-file=/root/backup/dbExport.conf –all-databases -u root > db.sql

اطلاعات داخل فایل dbExport.conf باید به صورت زیر باشد تا به صورت خودکار وارد پایگاه داده شود و خروجی داده بگیرد:

[mysqldump]

host=localhost

user=root

password=”PASSWORD”

· الان همه‌ی داده‌هایی که برای پشتیبان میخواهیم آماده شده است. یک رمز عبور بسیار وحشتناک بسازید(نیازی نیست حفظ کنید و فقط یک کپی از آن داشته باشید کافی هست) و آن را داخل فایلی به نام pass.txt قرار دهید. حالا باید اطلاعاتمون رو رمزگذاری کنیم:

#openssl enc -aes-256-cbc -e -pass file:pass.txt –in db.sql –out db-crypto.sql

#openssl enc -aes-256-cbc -e -pass file:pass.txt –in siteData.tar.gz –out  siteData-crypto.tar.gz

· اکنون ما ۲ فایل داریم که یکی از آنها حاوی فایل‌های وب‌سایت است و دیگری شامل پایگاه داده‌ی سایت ما است. محتوای این فایل‌ها رمزگذاری شده است. اکنون هرجا فایلهای رمزگذاری شده‌ را آپلود کنیم، مشکلی نخواهیم داشت. ما می‌خواهیم آنها را روی گوگل درایو آپلود کنیم. برای انکار ابتدا باید ابزار زیر را روی سرور دانلود کرده و سپس نصب نمایید. برای اینکار مراحل زیر را طی کنید(فایل زیر برای لینوکس۳۲بیتی هست. برای دریافت سایر نسخه‌ها/توزیع‌های دیگر لینوکس می‌توانید به صفحه‌ی نویسنده مراجعه کنید و نسخه مناسب خود را دریافت کنید):

#wget https://cdn.repozitor.com/public/gdrive

#chmod +x gdrive

#sudo install gdrive /usr/local/bin/gdrive

اکنون دستور زیر را بزنید:

#gdrive list

Id                            Name       Type   Size      Created

0BUPib2t2aVlCYk85em8     god.mp3      mp3    6.1 MB    2017-07-07 19:09:58

وقتی این دستور را بزنید به شما یک لینک یک‌بار مصرف می‌دهد. آن را در مرورگر خود کپی کنید و کلید اینتر را بزنید. درخواست اجازه گوگل را تایید کنید تا ترمینال سرور شما بتواند به گوگل درایو متصل شود. حال که دوباره این دستور را بزنید، لیست همه‌ی فایل‌های داخل گوگل درایو را به شما نمایش می‌دهد. برای اینکه بتوانیم فایل‌های رمزگذاری شده را داخل گوگل درایو آپلود‌ کنیم، از دستور زیر استفاده می‌کنیم:

#gdrive upload siteData-crypto.tar.gz

#gdrive upload db-crypto.sql

حال‌ پشتیبان‌های شما با موفقیت آپلود شد. اگر داخل گوگل درایو بروید می‌توانید ببینید که فایلها‌تان آنجا هست. لیست فایل‌های آپلود شده را می‌توانید با لیست‌گیری هم ببینید:

#gdrive list

Id                            Name                        Type      Size     Created

0B3m5DM0xFdVhmRmc             db-crypto.sql               sql       194 MB    2017-07-07 19:16:21

0B3fiZHVzd0VqWk1RY3M          siteData-crypto.tar.gz      tar.gz    1.8 GB    2017-07-07 19:16:13

0BUPib2t2aVlCYk85em8         god.mp3                     mp3       6.1 MB     2017-07-07 19:09:58

· اکنون شما یک بکاپ با موفقیت روی گوگل درایو آپلود کرده‌اید. حال می‌خواهیم فرآیند فوق را خودکار کنیم، به طوری که هر ۶ساعت یکبار این فرآیند انجام شود. برای اینکار ما نیاز داریم تا زمان‌بند کارهای سیستم را فعال کنیم. برای اینکار می‌توانید به سایت crontab-generator مراجعه کنید و  Task موردنظر خود را بسازید. چیزی که ما ساختیم آخرش این شد:

کار مربوط به بکاپ گیری از پایگاه داده:

0 */6 * * * /usr/bin/mysqldump –defaults-file=/home/repozitor/dbExport.conf –all-databases -u root | /usr/bin/openssl enc -aes-256-cbc -e -pass file:/home/repozitor/pass.txt > /home/repozitor/db-crypto.sql && /usr/local/bin/gdrive update 0B3m5DM0xFdVhmRmc /home/repozitor/db-crypto.sql

 

کار مربوط به بکاپ گیری از فایل‌های مورد نیاز:

0 */6 * * * /bin/tar czpvf – /home/repozitor/Desktop | /usr/bin/openssl enc -aes-256-cbc -e -pass file:/home/repozitor/pass.txt > /home/repozitor/siteData-crypto.tar.gz && gdrive update 0B3fiZHVzd0VqWk1RY3M /home/repozitor/siteData-crypto.tar.gz

توجه: ذکر ۲ نکته در مورد دستورات فوق ضروری می‌باشد:

عملگر && باعث می‌شود که اگر فرآیند رمزگذاری ناموفق بود تا هنوز تمام نشده است، فرآیند آپلود شروع نشود(بین ۲ دستور وابستگی از نوع ضروری ایجاد می‌کند).

حتما به جای gdrive upload باید از gdrive update استفاده کنید تا نسخه‌های قبلی پشتیبان شما حفظ شود. این دستور بارها و بارها اجرا می‌شود. اما گوگل درایو فقط ۱۰۰نسخه‌ی پشتیبان آخر شما را حفظ می‌کند. بنابراین ۱۰۰*۶ ساعت زمان اخرین نسخه از پشتیبان شما خواهد بود.

· در این مرحله باید دستور زیر را بزنید و کارهایی که ساخته‌اید در سیستم نصب شود و در زمان‌های مشخص اجرا شود:

crontab –e

با زدن این دستور یک محیط ویرایشگر متنی باز می‌شود. ۲کار فوق را که ساخته اید در اینجا بنویسید. سپس خارج شوید. در پایان به هنگام خروج از ویرایشگر به شما می‌گوید که کارها را روی سیستم نصب کرده است.

توجه: چنانچه در هر مرحله از پیاده‌سازی روش فوق برای شما سوالی پیش آمد، حتما در بخش نظرات(انتهای همین صفحه) سوال خود را مطرح کنید. سوال/پاسخ شما ممکن‌است برای دیگران مفید باشد. از ارسال ایمیل/پیام شخصی در این مورد بپرهیزید.

 

موفق باشید

جواد زندی

   

Trackback from your site.

Comments (1)

  • Avatar

    Armin

    |

    فقط موردی که توش بد نیست بزاری clear textنذاشتن root password سرور Mysql هست
    بد نیست per database یوزر در نظر بگیری و بدک هم نیست دیتابیس ها رو تک تک بگیری که نیاز نباشه بعدا از full dump با sed و… دیتابیسی که میخوای رو بیرون بکشی اینجا ما چند تا دیتابیس رو نمیخواستیم

    #!/bin/bash
    OUTPUT=”/backup/mysql”
    for db in `mysql -e “SHOW DATABASES;” | tr -d “| ” | grep -v Database`; do
    if [[ “$db” != “information_schema” ]] && [[ “$db” != _* ]] && [[ “$db” != “job_archive” ]]; then
    echo “Dumping database: $db”
    mysqldump –events –skip-lock-tables –force –databases $db | /bin/gzip > $OUTPUT/`date ‘+%Y-%m-%d–%H:%M:%S’`–$db.sql.gz
    fi
    done

    و در نهایت هم یه dumy file با حجم 1MB داشته باشی و توی /root/secretFilSystem به عنوان یه loopback device اون رو mount کنی و و با luks اون رو به صورت encrypted تو سرور کلا داشته باشی که کپی از disk drive سرورتون رو بردن پسوردهات دست کسی نباشه

    Reply

Leave a comment