تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

چگونه دیتابیس PostgreSQL را در اوبونتو 24.04 رمزنگاری کنیم؟


۲۲ اردیبهشت ۱۴۰۴

PostgreSQL یکی از پایگاه‌داده‌های رابطه‌ای متن‌باز و قدرتمند در دنیاست که از سال ۱۹۹۶ توسعه یافته است و به یکی از انتخاب‌های اصلی برای مدیریت داده‌ها در پروژه‌های پیچیده تبدیل شده است. برخلاف بسیاری از DBMSهای دیگر مثل MySQL یا Oracle، PostgreSQL این دیتابیس از ویژگی‌های پیشرفته‌ای مثل مدیریت هم‌زمانی پشتیبانی می‌کند. اما نکته‌ای که بسیاری به آن بی‌توجه‌ هستند، امنیت داده‌ها می‌باشد. در این مقاله قصد داریم چند روش عملی برای رمزنگاری دیتابیس‌های PostgreSQL را بررسی کنیم. بعضی از این روش‌ها نیاز به استفاده از ابزارها و کتابخانه‌های جانبی مثل OpenSSL و ZLib دارند که بسته به نیازتان می‌توانید از آن‌ها استفاده کنید. تا پایان همراه ما باشید.

زمانی که از Data at Rest صحبت می‌کنیم، منظور این‌است که داده‌های موجود در پایگاه داده، حتی زمانی که در حال پردازش نیستند و روی دیسک ذخیره شدند، باید به‌صورت رمزنگاری شده باقی بمانند. بنابراین رمزنگاری داده‌ها در حالت ثابت دیگر گزینه‌ای انتخابی نیست؛ بلکه یک الزام امنیتی به حساب می‌آید.

چگونه دیتابیس PostgreSQL را در اوبونتو 24.04 رمزنگاری کنیم؟

پیش‌نیازها

برای استفاده بهینه از مقاله، پیشنهاد می‌شود الزامات نرم‌افزاری زیر را، رعایت کنید:

sudo apt-get install libreadline8 libreadline-dev zlib1g-dev bison flex libssl-dev openssl

در ادامه می‌خوانید:

  • روش اول: رمزنگاری دیتابیس روی دیسک سیستم
  • روش دوم: رمزنگاری دیتابیس با استفاده از Transparent Data
  • روش سوم: رمزنگاری بخش‌هایی از دیتابیس
  • جمع‌بندی
  • سوالات متداول

روش اول: رمزنگاری دیتابیس روی دیسک سیستم

این روش مربوط به رمزنگاری داده‌های ثابت روی دیسک است. این ساده‌ترین نوع رمزنگاری است که در سیستم فایل اعمال می‌شود.

برای انجام این‌کار، ابتدا باید یک سیستم فایل رمزنگاری شده با استفاده از LUKS ایجاد کنید. LUKS یک مشخصه رمزنگاری دیسک است که به‌طور خاص برای سیستم‌عامل لینوکس طراحی شده است.

پس از تنظیم سیستم فایل رمزنگاری‌شده، می‌توانیم کلاسترهای PostgreSQL خود را در داخل این سیستم کپی کنیم تا رمزنگاری مورد نظر به‌دست آید. برای شروع، باید یک لیست از تمام سیستم‌های فایل موجود تهیه کنید. برای این کار از دستور زیر استفاده کنید:

df -hl

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

در خروجی کنسول پس از اجرای دستور فوق، ستونی به نام Mounted on خواهید دید که نشان‌دهنده پارتیشنی است که آن سیستم فایل خاص روی آن mount شده است.

فرض کنید که پارتیشن انتخابی شما /dev/vda15 است. حالا باید این پارتیشن را به‌صورت زیر unmount کنید:

sudo umount /dev/vda15

سپس، پارتیشن unmount شده را با دستور زیر فرمت کنید:

sudo wipefs -a /dev/vda15

بعد از تمام شدن فرمت، وقت آن است که پارتیشن را با استفاده از LUKS به‌صورت زیر رمزنگاری کنید:

sudo cryptsetup luksFormat /dev/vda15

اکنون، از شما خواسته می‌شود که یک پسورد وارد کنید. مطمئن شوید که پسورد انتخابی‌تان طولانی باشد و شامل کاراکترهای الفبایی و عددی باشد.

بعد از تمام شدن فرایند رمزنگاری، باید یک نقطه نگاشت (map_point) برای این پارتیشن ایجاد شود تا این پارتیشن رمزنگاری‌شده در سیستم‌ قابل مشاهده باشد.

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

sudo cryptsetup luksOpen /dev/vda15 map_point

این نگاشت سپس می‌تواند در زیر پارتیشن /dev/vda15 با استفاده از دستور زیر مشاهده شود:

lsblk

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

برای‌ این کار، می‌توانید یک سیستم فایل exFAT یا FAT32 ایجاد کنید. اکنون، بیایید یک سیستم فایل FAT32 بسازیم به صورت زیر:

sudo mkfs.vfat /dev/mapper/map_point -n encrypt_part

دستور بالا دو پارامتر مهم دارد:

/dev/mapper/map_point: این همان نقطه‌ نگاشتی است که قبلاً با استفاده از دستور luksOpen ایجاد کردیم. این مسیر به پارتیشن رمزنگاری‌شده ارجاع می‌دهد.

encrypt_part: این نام volume‌ای است که هنگام ساخت فایل سیستم مشخص می‌کنید. می‌توانید این نام را به هر چیزی که می‌خواهید تغییر دهید.

حال، فقط باید یک دایرکتوری بسازید تا این فایل‌سیستم را روی آن mount کنید. برای این‌کار کد زیر را وارد کنید:

mkdir /dev/vda15c
sudo mount /dev/mapper/map_point /dev/vda15c

اکنون، دایرکتوری /dev/vda15c را می‌توانید به‌همراه فایل‌سیستمی که روی آن mount شده، با اجرای دستور زیر مشاهده کنید:

df -hl

توجه: اگر اکنون دستور lsblk را اجرا کنید، در ستون type مربوط به map_point مقدار crypt نمایش داده می‌شود، که نشان می‌دهد این پارتیشن به‌صورت رمزنگاری‌شده تنظیم شده است.

تا اینجا، فایل‌سیستمی که روی پارتیشن /dev/mapper/encrypt_part ساخته شده، به‌صورت کامل رمزنگاری شده است و می‌توانید از آن به‌عنوان فضای ذخیره‌سازی امن برای دیتابیس PostgreSQL استفاده کنید.

برای مثال، می‌توانید دایرکتوری داده‌ی یک Cluster دیتابیس PostgreSQL که در مسیر خودش قرار دارد را به این پارتیشن رمزنگاری شده (/dev/mapper/encrypt_part) منتقل کنید.

پس از انتقال کامل داده‌ها می‌توانید پارتیشن را unmount کنید تا از دسترس خارج شود. هر زمانی که مجددا لازم بود به داده‌ها دسترسی داشته باشید، کافی است پارتیشن را mount کنید و سرویس PostgreSQL را مجدداً راه‌اندازی کنید.

حالا برای مدیریت دیتابیس، ابتدا با دستور زیر وارد حساب کاربری postgres شوید:

sudo -i -u postgres

پس از وارد شدن، برای ادامه فرایند، دستور زیر را اجرا کنید:

psql

اکنون، برای مشاهده دایرکتوری‌ای که دیتابیس‌ شما در آن قرار دارد، دستور زیر وارد کنید:

show data_directory

در کد بالا، مسیر دایرکتوری‌ای که در خروجی دستور مشاهده کردید را کپی کنید.

فرض کنید مسیر دایرکتوری داده‌ها به این شکل باشد: /var/lib/postgresql/14/main. حالا که محل ذخیره‌سازی فایل‌های پایگاه‌داده‌تان را می‌دانید، کافی است این فایل‌ها را به فایل‌سیستم رمزنگاری‌شده‌ی خود کپی کنید.

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

sudo -av /var/lib/postgresql /dev/vda15c

هشدار: ممکن است در خروجی دقیق‌تر، حالت (verbose) مشاهده کنید که بعضی از ویژگی‌ها به درستی منتقل نمی‌شوند. این کاملاً طبیعی است زیرا فایل‌سیستمی که فایل‌ها را به آن منتقل می‌کنید از نوع crypt است و اجازه تغییرات دسترسی (permissions) را به هیچ وجه نمی‌دهد.

پس از تمام شدن فرایند انتقال، دایرکتوری دیتابیس شما اکنون رمزنگاری شده است.

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

برای این‌کار، ابتدا سرویس PostgreSQL را متوقف کنید و سپس دستور umount را اجرا کنید:

sudo systemctl stop postgresql
sudo umount /dev/vda15c

در آخر این مرحله، شما یاد گرفتید که چگونه پایگاه‌داده PostgreSQL را در سطح دیسک رمزنگاری کنید:)

با پایگاه داده PostgreSQL لیارا، در کمترین زمان، یک دیتابیس قدرتمند، پرسرعت و امن راه‌اندازی کنید.
✅ پشتیبان‌گیری خودکار ✅ امنیت بالا ✅ عملکرد بهینه
خرید هاست ابری PostgreSQL لیارا

روش دوم: رمزنگاری دیتابیس با استفاده از Transparent Data

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

روش دیگر استفاده از Transparent Data Encryption (TDE) است که به طور پیش‌فرض در پکیج PostgreSQL گنجانده نشده و باید از منابع خارجی دانلود و نصب شود.

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

برای شروع، ابتدا باید PostgreSQL TDE را از ابزار CyberTec نصب کنید.

جهت نصب این ابزار، دستور زیر را اجرا کنید:

wget https://download.cybertec-postgresql.com/postgresql-12.3_TDE_1.0.tar.gz

پس از دانلود پکیج، باید آن را استخراج کنید:

tar xvfz postgresql-12.3_TDE_1.0.tar.gz

یک دایرکتوری با نام postgresql-12.3_TDE_1.0.tar.gz در root ایجاد خواهد شد.
اکنون باید مسیر فعلی خود را به این دایرکتوری جدید تغییر دهید، به‌طور زیر:

cd postgresql-12.3_TDE_1.0.tar.gz

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

sudo apt-get install libldap2-dev libperl-dev python-dev

حالا می‌توانید مراحل نصب CyberTec را با دستور زیر انجام دهید:

./configure --prefix=/usr/local/pg12tde --with-openssl --with-perl \
 --with-python --with-ldap

پس از آن، دستور زیر را اجرا کنید:

sudo make install

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

cd contrib
sudo make install

پس از اتمام دستور بالا، اکنون باید کلیدی را که برای رمزنگاری استفاده خواهد شد، تنظیم کنید.

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

cd \
touch provide_key.sh

فایل را با ویرایشگر دلخواه یا nano باز کنید:

nano provide_key.sh

کلید زیر را در فایل وارد کرده و آن را ذخیره کنید:

echo 8ae8234234h243294324

کلید می‌تواند هر مقداری که بخواهید باشد. حالا تنها کاری که باید انجام دهید این است که به این فایل یک ویژگی بدهید تا از طریق دستور chmod قابل دسترسی باشد:

chmod %x /provide_key.sh

اکنون با دستور زیر می‌توانید به حساب‌کاربری postgres خود وارد شوید:

sudo su - postgres

پس از این مرحله، حالا بایددیتابیس خود را در یک دایرکتوری راه‌اندازی کنید. این کار ضروری است تا از بروز هرگونه خطای مجوز در هنگام اجرای سرور postgres جلوگیری شود.

برای ایجاد این دایرکتوری، از دستور زیر استفاده کنید:

sudo mkdir /usr/local/postgres

سپس با دستورات زیر، ویژگی‌های لازم را به آن اضافه کنید تا بتوانید بعداً به آن دسترسی پیدا کنید:

sudo chmod 775 /usr/local/postgres
sudo chown postgres /usr/local/postgres

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

export PATH=$PATH:/usr/local/pgsql/bin

و در نهایت، دستور زیر را اجرا کنید:

initdb -D /usr/local/postgres -K /provide_key.sh

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

....Success. You can now start the database server using:

 pg_ctl -D /usr/local/postgres -l logfile start

در آخر باید بگوییم، برای راه‌اندازی سرور TDE در Postgres، کلیدی که در فایل provide_key.sh دریافت می‌کنید برای خواندن و نوشتن داده‌ها استفاده می‌شود و این کار، امنیت داده‌ها موقع انتقال را فراهم می‌کند.

شاید سوال کنید که چگونه این روش دیتابیس را در حالت ثابت رمزنگاری می‌کند؟

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

بنابراین، به محض خاموش شدن سرور، اطمینان دارید که داده‌ها روی دیسک با همان کلید رمزنگاری شده‌اند. به این ترتیب، این روش امنیت را هم در حین استفاده و هم در حالت ثابت فراهم می‌کند.

آموزش کامل بکاپ گیری از PostgreSQL در اوبونتو 24.04 را در مقاله زیر بخوانید.
بکاپ گیری از PostgreSQL

روش سوم: رمزنگاری بخش‌هایی از دیتابیس

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

برای این‌کار، ابتدا باید افزونه pgcrypto را نصب کنید. وارد حساب postgres شوید و دستور زیر را اجرا کنید:

create extension if not exists pgcrypto;

مستندات pgcrypto یک لیست کوتاه از دستورات برای رمزنگاری و رمزگشایی داده‌ها ارائه می‌دهند. در اینجا، برای شروع، از رمزنگاری با کلید symmetric استفاده می‌کنیم.

در واقع، برای رمزنگاری ساده، می‌توان فرض کرد که استفاده از یک کلید با طول 1 تا 3 کار می‌کند و نتیجه قابل خواندن خواهد بود.

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

حالا می‌توانید این روش را امتحان کنید. ابتدا با ایجاد یک جدول test_login شروع می‌کنیم:

create table test_login (name VARCHAR(50), password TEXT);

مقادیر را در جدول وارد کنید و مطمئن شوید که پسورد به درستی رمزنگاری می‌شود. برای این کار از تابع pgp_sym_encrypt برای رمزنگاری پسورد استفاده می‌کنیم:

insert into test_login (name, password) values ('Jonathon', pgp_sym_encrypt('123ab', 'd3a')::TEXT)

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

برای رمزگشایی این مقدار، کافی است که از دستور زیر استفاده کنید:

select
	name,
	pgp_sym_decrypt(password::bytea, 'd3a')
from
test_login;

این دستور، پسورد را به صورت اصلی و رمزگشایی شده برمی‌گرداند. به این ترتیب، شما می‌توانید در مواقع نیاز، رمزنگاری پایگاه داده را در حالت ثابت (at rest) انجام دهید.

با سرور اوبونتو لیارا، سرور خود را با هزینه به‌صرفه و بالاترین کارایی مدیریت کنید.
✅ استقرار سریع ✅ منابع بهینه ✅ امنیت پیشرفته
خرید سرور مجازی اوبونتو ساعتی لیارا

جمع‌بندی

در این مقاله از لیارا به بررسی روش‌های مختلف رمزنگاری پایگاه‌داده PostgreSQL پرداختیم. ابتدا با روش رمزنگاری در سطح دیسک با استفاده از LUKS آشنا شدیم که ساده‌ترین روش است و به طور کلی فایل‌سیستم را محافظت می‌کند. سپس به Transparent Data Encryption (TDE) پرداختیم که امنیت داده‌ها را در زمان انتقال و ذخیره‌سازی تضمین می‌کند. در نهایت، به رمزنگاری بخش‌های خاص پایگاه‌داده با استفاده از افزونه pgcrypto اشاره کردیم. این روش‌ها با توجه به نیاز خاص هر سیستم می‌توانند امنیت داده‌ها را در حین استفاده و در حالت ثابت فراهم کنند.

آموزش کامل نصب و استفاده از PostgreSQL در سرور مجازی اوبونتو 22.04 را می‌توانید در مقاله زیر مطالعه کنید.
نحوه نصب PostgreSQL

سوالات متداول

چطور پایگاه‌داده PostgreSQL را رمزنگاری کنم؟

می‌توانید از روش‌هایی مانند LUKS برای رمزنگاری سطح دیسک یا از افزونه pgcrypto برای رمزنگاری بخش‌های خاص استفاده کنید.

آیا استفاده از LUKS برای رمزنگاری PostgreSQL مناسب است؟

بله، LUKS رمزنگاری سطح دیسک را فراهم می‌کند و امنیت داده‌ها را هنگام ذخیره‌سازی افزایش می‌دهد.

چطور داده‌ها را با pgcrypto رمزنگاری کنم؟

با استفاده از دستورات pgcrypto می‌توانید داده‌ها را با یک کلید رمزنگاری کرده و هنگام نیاز آن‌ها را رمزگشایی کنید. این روش به شما امکان می‌دهد تا تنها بخش‌هایی از پایگاه‌داده را که نیاز به محافظت دارند، ایمن کنید.

آیا TDE در PostgreSQL قابل استفاده است؟

TDE به‌طور پیش‌فرض در PostgreSQL وجود ندارد، اما با ابزارهایی مانند CyberTec قابل نصب است.

به اشتراک بگذارید