پیکربندی و راه‌اندازی TCPS در دیتابیس اوراکل

این مقاله جامع و تفصیلی برای درک عمیق‌تر و اجرای گام‌به‌گام ارتباط امن (TCPS) در دیتابیس اوراکل تهیه شده است. در ابتدا به بررسی مفاهیم و اصطلاحات می‌پردازیم و سپس هر دستور را با جزئیات کامل (سوئیچ‌ها و پارامترها) کالبدشکافی می‌کنیم.


بخش اول: واژه‌نامه و مفاهیم پایه (Glossary of Terms)

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

  • TCPS (TCP with SSL/TLS): پروتکل ارتباطی اختصاصی اوراکل است که همان پروتکل استاندارد TCP را با استفاده از لایه‌های رمزنگاری SSL/TLS امن می‌کند. در این بستر، داده‌ها بین کلاینت و سرور به صورت رمزنگاری‌شده (Encrypted) منتقل می‌شوند.
  • Private Key (کلید خصوصی): یک رشته کدهای رمزنگاری شده بسیار محرمانه است که روی سرور نگهداری می‌شود و برای باز کردن (Decrypt) داده‌هایی که با کلید عمومی (Public Key) قفل شده‌اند، استفاده می‌شود.
  • CSR (Certificate Signing Request): یک فایل متنی حاوی اطلاعات هویتی سرور (نام سازمان، دامنه، کشور و…) و کلید عمومی است. این فایل تولید می‌شود تا برای یک مرجع صدور گواهی ارسال گردد.
  • CA (Certificate Authority): مرجع صدور گواهی (مانند یک سازمان معتبر یا دپارتمان امنیت شبکه داخلی بانک) که هویت سرور را تایید کرده و گواهی‌نامه (Certificate) معتبر صادر می‌کند. شامل دو بخش Root CA (ریشه اصلی) و Sub CA (زیرشاخه یا واسط) است.
  • PEM و DER: دو فرمت رایج برای ذخیره گواهی‌نامه‌ها هستند. DER فرمت باینری (کدهای صفر و یک) و PEM فرمت متنی (Base64) است. ابزارهای اوراکل و OpenSSL غالباً با فرمت PEM راحت‌تر کار می‌کنند.
  • PKCS#12 (فایل‌های p12.): یک استاندارد رمزنگاری است که به ما اجازه می‌دهد کلید خصوصی، گواهی اصلی سرور و زنجیره گواهی‌ها را در یک فایل واحد و امن بسته‌بندی کنیم.
  • Oracle Wallet: کیف پول اختصاصی اوراکل که محفظه‌ای امن برای نگهداری کلیدها، رمزهای عبور و گواهی‌نامه‌هاست.
  • orapki: ابزار خط فرمان (CLI) اوراکل برای مدیریت زیرساخت کلید عمومی (PKI) و کیف پول‌ها (Wallets).
  • Listener (لیسنر): سرویسی در اوراکل که در پس‌زمینه سرور اجرا شده و منتظر درخواست‌های اتصال کلاینت‌ها می‌ماند.

بخش دوم: آموزش تفصیلی و کالبدشکافی دستورات

فاز ۱: تولید کلیدها و مدیریت گواهی‌نامه‌ها (سمت سرور)

۱. تولید کلید خصوصی سرور

ابتدا باید یک کلید خصوصی برای دیتابیس خود بسازیم:

openssl genpkey -algorithm rsa -out tcpsdbdatabase.key -pkeyopt rsa_keygen_bits:2048

توضیح اجزای دستور:

  • openssl genpkey: دستور پایه OpenSSL برای تولید کلید خصوصی (General Private Key).
  • -algorithm rsa: مشخص می‌کند که الگوریتم رمزنگاری کلید از نوع RSA باشد (رایج‌ترین و استانداردترین الگوریتم).
  • -out tcpsdbdatabase.key: نام و مسیر فایلی که کلید در آن ذخیره می‌شود را مشخص می‌کند.
  • -pkeyopt rsa_keygen_bits:2048: طول کلید را روی ۲۰۴۸ بیت تنظیم می‌کند (طول استاندارد برای امنیت بالا و عملکرد مناسب).

۲. ساخت فایل درخواست امضا (CSR)

openssl req -new -key tcpsdbdatabase.key -out tcpsdbdatabase.csr

توضیح اجزای دستور:

  • req -new: از OpenSSL می‌خواهد یک درخواست جدید (Request) برای صدور گواهی بسازد.
  • -key tcpsdbdatabase.key: به فایل کلید خصوصی که در مرحله قبل ساختیم اشاره می‌کند تا کلید عمومی متناظر با آن را در CSR قرار دهد.
  • -out tcpsdbdatabase.csr: فایل خروجی درخواست را می‌سازد.
  • نکته: در این مرحله اطلاعاتی مثل C=IR (کشور)، O=vahiddbBank (سازمان) و CN=lin-tcpsdbdatabase-162 (نام دقیق سرور یا Common Name) از شما پرسیده می‌شود که باید دقیق وارد شوند.

۳. تبدیل فرمت گواهی‌ها (DER به PEM) و ساخت زنجیره

وقتی CA گواهی‌ها را به شما تحویل داد، اگر فرمت آن‌ها باینری (DER) بود، باید به متنی (PEM) تبدیل شوند:

openssl x509 -inform der -in BankvahiddbRootCA.der -out BankvahiddbRootCA.pem

توضیح اجزای دستور:

  • x509: استاندارد مدیریت گواهی‌های دیجیتال.
  • -inform der: به سیستم می‌گوید فرمت فایل ورودی DER است.
  • -in و -out: فایل ورودی و خروجی را مشخص می‌کنند.

سپس باید گواهی‌های مرجع را پشت سر هم قرار دهیم تا «زنجیره گواهی» ساخته شود:

cat BankvahiddbRootCA.pem BankvahiddbSubCA.pem > chain.pem

دستور cat محتوای دو فایل را خوانده و با عملگر > آن‌ها را داخل فایل جدید chain.pem می‌ریزد.

۴. ساخت پکیج نهایی PKCS#12

حالا تمام اجزا (گواهی سرور، کلید خصوصی، زنجیره CA) را در یک بسته جمع می‌کنیم:

openssl pkcs12 -export -in MaliDataBase.pem -inkey tcpsdbdatabase.key -certfile chain.pem -out tcpsdbdatabase.p12 -name "tcpsdbdatabase"

توضیح اجزای دستور:

  • pkcs12 -export: دستور ساخت و خروجی گرفتن یک فایل یکپارچه PKCS#12.
  • -in MaliDataBase.pem: فایل گواهی اصلی سرور که از CA دریافت کرده‌اید.
  • -inkey tcpsdbdatabase.key: فایل کلید خصوصی شما.
  • -certfile chain.pem: فایل زنجیره گواهی‌های مرجع (Root و Sub).
  • -out tcpsdbdatabase.p12: نام فایل نهایی که ساخته می‌شود.
  • -name "tcpsdbdatabase": یک نام مستعار (Alias) برای این بسته تعیین می‌کند تا شناسایی آن در Wallet راحت‌تر باشد.

فاز ۲: راه‌اندازی Oracle Wallet (سمت سرور)

۵. ساخت کیف پول اوراکل (Wallet)

orapki wallet create -wallet /u01/app/grid/wallet/ -auto_login_local

توضیح اجزای دستور:

  • orapki wallet create: دستور ساخت کیف پول جدید.
  • -wallet /u01...: مسیری که می‌خواهیم کیف پول در آنجا ساخته شود (معمولاً در مسیر Grid ذخیره می‌شود تا در محیط‌های RAC هم در دسترس باشد).
  • -auto_login_local: این سوئیچ بسیار مهم است. باعث می‌شود فایل cwallet.sso (Single Sign-On) در کنار ewallet.p12 ساخته شود. با این کار، سرویس‌های اوراکل روی همین سرور می‌توانند بدون نیاز به وارد کردن پسورد، کیف پول را بخوانند. کلمه local یعنی این کیف پول حتی اگر کپی شود، روی سرور دیگری کار نخواهد کرد (برای امنیت بیشتر).

۶. وارد کردن بسته گواهی‌ها به کیف پول

orapki wallet import_pkcs12 -wallet /u01/app/grid/wallet/ -pkcs12file tcpsdbdatabase.p12

توضیح اجزای دستور:

  • import_pkcs12: دستور وارد کردن فایل یکپارچه‌ای که در مرحله ۴ ساختیم.
  • -pkcs12file: آدرس فایل p12 را به آن می‌دهیم.

(نکته: پیام خطای Cannot modify auto-login (sso) wallet در خروجی این دستور طبیعی است و به عنوان یک هشدار نادیده گرفته می‌شود، زیرا عملیات اصلی موفقیت‌آمیز است).


فاز ۳: پیکربندی شبکه دیتابیس (فایل‌های ora)

۷. تنظیمات sqlnet.ora (تعیین رفتار شبکه)

باید فایل sqlnet.ora در دو مسیر تنظیم شود (مسیر Grid برای Listener و مسیر Database برای اتصالات محلی). مقادیر زیر به آن اضافه می‌شود:

  • WALLET_LOCATION = ...: مسیر دقیق فایلی که کیف پول در آن است را به دیتابیس معرفی می‌کند.
  • SSL_CLIENT_AUTHENTICATION = FALSE: به دیتابیس می‌گوید نیازی نیست از کلاینت‌ها گواهی امنیتی درخواست کند (احراز هویت فقط سمت سرور است).
  • SSL_SERVER_DN_MATCH = NO: چک کردن سخت‌گیرانه نام دامنه سرور (Distinguished Name) با گواهی را غیرفعال می‌کند تا در صورت وجود مغایرت جزئی در نام ماشین، ارتباط قطع نشود.

۸. تنظیمات listener.ora (باز کردن پورت امن)

در تنظیمات لیسنر، باید آدرس جدیدی برای پذیرش اتصالات امن اضافه شود. معمولا این خط به آدرسی که به tcp اشاره می کند، اضافه می شود:

ADDRESS = (PROTOCOL = TCPS)(HOST = tcpsdbdatabase)(PORT = 2484)

  • PROTOCOL = TCPS: استفاده از پروتکل امن.
  • PORT = 2484: پورت استاندارد و پیش‌فرض اوراکل برای TCPS (برخلاف ۱۵۲۱ که برای TCP عادی است).

بعد از این تغییرات لیسنر باید متوقف (lsnrctl stop) و مجدداً راه‌اندازی (lsnrctl start) شود.


فاز ۴: تنظیمات کلاینت (سیستمی که به دیتابیس وصل می‌شود)

برای اینکه کلاینت به سرور اعتماد کند، باید گواهی‌های مرجع (CA) بانک/سازمان روی سیستم کلاینت نصب شود.

۹. ساخت کیف پول کلاینت و معرفی گواهی‌های معتبر (Trusted)

orapki wallet create -wallet C:\app\client\wallet -auto_login_local
orapki wallet add -wallet C:\app\client\wallet -trusted_cert -cert BankvahiddbRootCA.cer

توضیح اجزای دستور:

  • خط اول مشابه سرور یک کیف پول خالی برای کلاینت می‌سازد.
  • add -trusted_cert: این دستور یک گواهی‌نامه را به عنوان گواهی “قابل اعتماد” به کیف پول اضافه می‌کند تا کلاینت بداند هر سروری که توسط این CA امضا شده باشد، امن است.
  • -cert BankvahiddbRootCA.cer: مسیر فایل گواهی CA را مشخص می‌کند.

۱۰. تنظیم tnsnames.ora در کلاینت

باید در کلاینت یک TNS (نام مستعار اتصال) تعریف شود:

dbtpcs =
  (ADDRESS = (PROTOCOL = TCPS)(HOST = 1.1.1.1)(PORT = 2484))
  (SERVICE_NAME = odb)

در اینجا مشخصاً کلاینت هدایت می‌شود که از طریق IP سرور (1.1.1.1)، پورت 2484 و پروتکل TCPS به سرویس دیتابیس (odb) متصل شود.


فاز ۵: تست و ارزیابی نهایی

۱۱. بررسی نوع اتصال با SYS_CONTEXT

پس از اتصال کلاینت با دستور sqlplus test/test@dbtpcs، کلاینت در محیط دیتابیس دستور زیر را اجرا می‌کند:

SELECT 
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') as protocol,
SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') as auth_meth
FROM DUAL;

توضیح دستور و خروجی:

  • تابع SYS_CONTEXT: یک تابع سیستمی در اوراکل است که اطلاعات نشست جاری (Session) را برمی‌گرداند.
  • فضای نام 'USERENV': به متغیرهای محیطی کاربر جاری اشاره دارد.
  • پارامتر 'NETWORK_PROTOCOL': از دیتابیس می‌پرسد که من با چه پروتکلی به شما وصل شده‌ام. اگر خروجی مقدار tcps باشد، یعنی تمام زحمات ما نتیجه داده و ارتباط به صورت ۱۰۰٪ امن و رمزنگاری‌شده برقرار شده است.
  • پارامتر 'AUTHENTICATION_METHOD': روش احراز هویت را مشخص می‌کند.