از دیتابیست پشت دیوارِ اعتماد محافظت کن

مقدمه
امنیت واقعی در پایگاه داده فقط به سیاست‌های رمز عبور یا سطح دسترسی کاربران محدود نمی‌شود. اگر دیتابیس در معرض اتصال از هر IP یا سیستم ناشناخته‌ای باشد، تمام آن لایه‌های امنیتی بی‌اثر می‌شوند. باید دور دیتابیس دیوار بکشیم؛ یعنی فقط سیستم‌هایی اجازه اتصال داشته باشند که خودمان مشخص کرده‌ایم. اوراکل این امکان را از طریق فایل sqlnet.ora فراهم کرده است.

چرا باید اتصال‌ها را محدود کنیم
در اغلب محیط‌ها، دیتابیس روی شبکه‌ای قرار دارد که چند سرور دیگر هم به آن دسترسی دارند. ممکن است سرور گارد، اپلیکیشن سرور یا ابزار مانیتورینگ مانند OEM نیاز به اتصال داشته باشند. اما همین باز بودن پورت برای تمام IPها، یک نقطه خطر است. هر موجودیتی که credential داشته باشد می‌تواند تلاش کند به دیتابیس وصل شود. با فعال کردن white list در sqlnet.ora می‌توانیم تعیین کنیم فقط آدرس‌های خاص مجاز باشند و بقیه اتصال‌ها حتی به مرحله احراز هویت نرسند.

مراحل فعال‌سازی White List
برای محدود کردن اتصال‌ها باید سه پارامتر زیر در فایل sqlnet.ora تنظیم شوند:

TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.188.3, 127.0.0.1,192.168.188.61)

با این تنظیمات فقط IPهای مشخص‌شده در بخش INVITED_NODES اجازه اتصال خواهند داشت. سایر آدرس‌ها بلاک می‌شوند. در این مثال:
192.168.188.61 سرور tehran1 است
192.168.188.62 سرور tehran2 است
192.168.188.3 سروری است که یک CDB با یک PDB به نام oraclepdb در آن ساخته شده
127.0.0.1 برای اتصال‌های داخلی سرور استفاده می‌شود

محل قرارگیری فایل sqlnet.ora
اگر Listener تحت نرم افزار دیتبایس اجرا می‌شود، باید فایل در مسیر Oracle Home دیتابیس قرار بگیرد، مثلاً:


/u01/app/oracle/product/19c/dbhome/sqlnet.ora


اما اگر Listener توسط Grid Infrastructure مدیریت می‌شود ، باید فایل را در مسیر Grid Home قرار دهی، مثلاً:


/u01/app/oracle/product/19c/dbhome/sqlnet.ora

در محیط تست ما این home ها وجود دارد:

 cat /etc/oratab

+ASM:/u01/app/19c/grid:N
orcl:/u01/app/oracle/product/19c/dbhome:N
vahidcdb:/u01/app/oracle/product/19c/dbhome:N


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


lsnrctl status | grep "Listener Parameter File"

خروجی فایل:

 

[oracle@oracle8101924 ~]$ lsnrctl status | grep "Listener Parameter File"
Listener Parameter File   /u01/app/19c/grid/network/admin/listener.ora


در همان مسیر باید sqlnet.ora را هم ویرایش یا ایجاد کنی.

اعمال تغییرات
بعد از ویرایش sqlnet.ora باید Listener را Reload کنی تا تنظیمات جدید اعمال شوند. این کار بدون نیاز به توقف Listener انجام می‌شود:


lsnrctl reload


در صورت نیاز می‌توان Listener را به طور کامل Stop و سپس Start کرد:


lsnrctl stop
lsnrctl start

نکات امنیتی و عملیاتی
در محیط‌هایی که Data Guard یا RAC که چند سرور درگیر هستند، آدرس همه سرورها را در white list وارد کن تا تبادل redo و ارتباطات مدیریتی دچار مشکل نشود.
اگر sqlnet.ora را در مسیر اشتباهی قرار دهی (مثلاً در Home دیتابیس در حالی که Listener در Grid فعال است)، هیچ اثری نخواهد داشت. پس حتماً مسیر فایل فعال Listener را بررسی کن.
در فایل sqlnet.log می‌توانی مشاهده کنی که اتصال از چه آدرسی رد شده یا پذیرفته شده است. من در محیط SINGLE این موضوع رو تست کردم و در اولین فرصت در RAC هم تست می کنم. اگر خواستید استفاده کنید، قبلش تو محیط تست RAC اجراش کنید.

تست اتصال:

از سرور tehran2 قبل از اعمال whitelist به دیتابیس تست اتصال می گیریم:

[oracle@tehran2 dbhome]$ tnsping oraclepdb

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 22-OCT-2025 07:20:27

Copyright (c) 1997, 2024, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/19c/dbhome/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle8101924.vahiddb.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oraclepdb)))
TNS-12537: TNS:connection closed
[oracle@tehran2 dbhome]$ tnsping oraclepdb

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 22-OCT-2025 07:21:06

Copyright (c) 1997, 2024, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/19c/dbhome/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle8101924.vahiddb.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oraclepdb)))
OK (10 msec)
[oracle@tehran2 dbhome]$ sqlplus sys@oraclepdb as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Oct 22 07:21:15 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.25.0.0.0

sys@oraclepdb(74)> exit;
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.25.0.0.0
[oracle@tehran2 dbhome]$ ifconfig | grep 192
        inet 192.168.188.62  netmask 255.255.255.0  broadcast 192.168.188.255

 

حالا تغییرات رو اعمال می کنیم و دوباره تست اتصال می گیریم.

 

[oracle@tehran2 dbhome]$ tnsping oraclepdb

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 22-OCT-2025 07:23:16

Copyright (c) 1997, 2024, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/19c/dbhome/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle8101924.vahiddb.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oraclepdb)))
TNS-12547: TNS:lost contact
[oracle@tehran2 dbhome]$ sqlplus sys@oraclepdb as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Oct 22 07:23:20 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Enter password:
ERROR:
ORA-12547: TNS:lost contact

اجازه ارتباط داده نمی شود.

نتیجه‌گیری
با چند خط تنظیم ساده در فایل sqlnet.ora می‌توانی جلوی بسیاری از اتصال‌های غیرمجاز را بگیری. این کار در واقع کشیدن یک دیوار واقعی دور دیتابیس است. از این پس حتی اگر کسی رمز عبور را بداند، بدون IP مجاز نمی‌تواند به دیتابیس دسترسی پیدا کند. تنظیم درست sqlnet.ora در کنار reload کردن Listener ساده‌ترین اما مؤثرترین گام برای امن‌سازی ارتباط‌ها در Oracle Database است.