دست گرمی با پسوردفایل

همانطور که می دانید، برای لاگین از راه دور به بانک اطلاعاتی، آن هم از طریق administrative privilegeها(از قبیل sysdba و sysoper)، ناگزیر باید password file را برای بانک ایجاد کرده باشیم در غیر این صورت، با خطا مواجه خواهیم شد:

[oracle@myhost ~]$ sqlplus “sys/a@mydb1 as sysdba”

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 12:27:51 1397

Version 18.3.0.0.0

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

ERROR:

ORA-01017: invalid username/password; logon denied

Enter user-name:

پسوردفایل به طور رایج، در مسیر زیر قرار می گیرد(در لینوکس):

$ORACLE_HOME/dbs

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

orapw$ORACLE_SID

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

[oracle@myhost ~]$ orapwd

Usage 1: orapwd file=<fname> force={y|n} asm={y|n}

          dbuniquename=<dbname> format={12|12.2}

          delete={y|n} input_file=<input-fname>

          ‘sys={y | password | external(<sys-external-name>)

                | global(<sys-directory-DN>)}’

          ‘sysbackup={y | password | external(<sysbackup-external-name>)

                      | global(<sysbackup-directory-DN>)}’

          ‘sysdg={y | password | external(<sysdg-external-name>)

                  | global(<sysdg-directory-DN>)}’

          ‘syskm={y | password | external(<syskm-external-name>)

                  | global(<syskm-directory-DN>)}’

برای مثال، با دستور زیر، پسوردفایل را برای بانکی با نام mydb1 ایجاد می کنیم:

 [oracle@myhost ~]$ orapwd file=’/18c/home/dbs/orapwmydb1′ password=myname_is_123 force=y

با این دستور، پسورد کاربر sys، به عبارت myname_is_123 تعیین خواهد شد و همچنین درصورتی که پسوردفایل از قبل موجود باشد، به جهت استفاده از پارامتر force=y، بازنویسی خواهد شد. با اجرای این دستور، می توان به راحتی از طریق مجوز sysdba به بانک لاگین کرد:

[oracle@myhost ~]$ sqlplus “sys/myname_is_123@192.168.1.20:1521/mydb1 as sysdba

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 13:09:50 1397

Version 18.3.0.0.0

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

Last Successful login time: Sat Nov 17 2018 13:08:17 +03:30

Connected to:

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

Version 18.3.0.0.0

SQL>

نام پسوردفایل(orapw$ORACLE_SID)، میتواند فاقد ORACLE_SID$ باشد:

[oracle@myhost ~]$ rm -rf /18c/home/dbs/orapwmydb1

 [oracle@myhost ~]$ orapwd file=’/18c/home/dbs/orapwpassword=myname_is_123

در این صورت باز هم لاگین به بانک با مجوز sysdba امکان پذیر خواهد بود:

[oracle@myhost ~]$ sqlplus “sys/myname_is_123@192.168.1.20:1521/mydb1 as sysdba”

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 13:12:45 1397

Version 18.3.0.0.0

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

Last Successful login time: Sat Nov 17 2018 13:09:50 +03:30

Connected to:

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

Version 18.3.0.0.0

SQL>

اگر همراه با این نرم افزار، بانک دیگری را هم ایجاد کرده باشیم، باز هم می توانیم از همین پسوردفایل استفاده کنیم. برای مثال، در دستورات زیر، با حذف پسوردفایل orapwmydb2، مجدد به بانک mydb2 لاگین خواهیم کرد ان هم با مجوز sysdba و به صورت از راه دور:

[oracle@myhost ~]$ rm -rf /18c/home/dbs/orapwmydb2

[oracle@myhost ~]$ ll /18c/home/dbs/orapw*

-rw-r—– 1 oracle oinstall 6144 Nov 17 13:12 /18c/home/dbs/orapw

[oracle@myhost ~]$ sqlplus “sys/myname_is_123@192.168.1.20:1521/mydb2 as sysdba”

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 13:31:10 1397

Version 18.3.0.0.0

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

Last Successful login time: Sat Nov 17 2018 13:12:45 +03:30

Connected to:

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

Version 18.3.0.0.0

SQL>

این مسئله با سرویس auditd در لینوکس هم قابل اثبات می باشد. با تنظیمات زیر، عملیات read و wite بر روی orapw، در فایل لاگ ثبت خواهد شد:

[root@myhost ~]# vi /etc/audit/audit.rules

-w /18c/home/dbs/orapw -p rwxa

[root@myhost ~]# service auditd restart

Stopping auditd:                                           [  OK  ]

Starting auditd:                                             [  OK  ]

با تنظیم این سرویس، مجدد با مجوز sysdba به بانک mydb2 لاگین می کنیم:

[oracle@myhost ~]$ sqlplus “sys/myname_is_123@192.168.1.20:1521/mydb2 as sysdba”

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 13:31:10 1397

Version 18.3.0.0.0

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

Last Successful login time: Sat Nov 17 2018 13:12:45 +03:30

Connected to:

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

Version 18.3.0.0.0

SQL>

با رجوع به لاگ مربوطه، خواهیم دید که فایل orapw، مورد دسترسی واقع شده است:

[root@myhost ~]# tail -f /var/log/audit/audit.log

type=PATH msg=audit(1542450527.888:196468): item=0 name=”/18c/home/dbs/orapw” inode=6430133 dev=08:03 mode=0100640 ouid=54321 ogid=54321 rdev=00:00

در همین حال، که دو بانک با نامهای mydb2 و mydb1 از یک پسوردفایل استفاده می کنند، کاربری را با نام nimkat در بانک mydb1 ایجاد می کنیم و به آن مجوز sysdba می دهیم:

SQL> create user nimkat identified by a;

User created.

SQL> grant sysdba to nimkat;

Grant succeeded.

با اهدای مجوز sysdba به کاربر nimkat، فایل orapw دست خواهد خورد:

type=PATH msg=audit(1542451858.720:196550): item=0 name=”/18c/home/dbs/orapw” inode=6430133 dev=08:03 mode=0100640 ouid=54321 ogid=54321 rdev=00:00

type=SYSCALL msg=audit(1542451858.720:196551): arch=c000003e syscall=2 success=yes exit=8 a0=7ffc228281a8 a1=0 a2=0 a3=7fd1ea16bbe0 items=1 ppid=1 pid=24664 auid=0 uid=54321 gid=54321 euid=54321 suid=54321 fsuid=54321 egid=54321 sgid=54321 fsgid=54321 ses=17203 tty=(none) comm=”oracle_24664_no” exe=”/18c/home/bin/oracle” key=(null)

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

[oracle@myhost ~]$ strings -5 /18c/home/dbs/orapw

ORACLE Remote Password file

CE3733BA7BF2F9D3

LUJI_RVg

NIMKAT

0D2F017953409DFB

DEFAULT

حال سوال مهمی مطرح می شود:

می توان به بانک mydb2 از طریق کاربر nimkat و با مجوز sysdba لاگین کرد؟؟؟

جواب مثبت است. ببینید:

[oracle@myhost ~]$ sqlplus “nimkat/a@192.168.1.20:1521/mydb2 as sysdba

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 14:25:06 1397

Version 18.3.0.0.0

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

Last Successful login time: Sat Nov 17 2018 14:24:59 +03:30

Connected to:

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 – Production

Version 18.3.0.0.0

SQL> show user

USER is “SYS”

لاگین با موفقیت انجام شد، در صورتی که دیتابیس mydb2، به صورت کلی کاربری با نام nimkat ندارد!!!

SQL> show parameter instance_name

NAME                                 TYPE        VALUE

———————————— ———– ——————————

instance_name                        string      mydb2

SQL> select username from cdb_users p where p.USERNAME=’NIMKAT’;

no rows selected

همانطور که ملاحظه شد، بدون وجود کاربری به نام nimkat در بانک mydb2، با مجوز sysdba و با پسوردفایل orapw به آن لاگین کردیم.

نکته 1: به صورت کلی هرگاه با مجوز sysdba به بانکی لاگین می کنیم، از نام کاربر وارد شده، صرف نظر می شود و کاربر ما برابر با sys خواهد شد و با ایجاد یک شی جدید، مالک این شی، کاربر sys خواهد بود. در مثال قبلی، با اینکه با کاربر nimkat به mydb2 لاگین کردیم، دستور show user، نام کاربر را sys برمی گرداند.

نکته 2: ویوی V$PWFILE_USERS با خواندن پسوردفایل، لیست کاربرانی که مجوز admin privilege دارند را نمایش خواهد داد:

[oracle@myhost ~]$ sqlplus “nimkat/a@192.168.1.20:1521/mydb2 as sysdba”

SQL> select USERNAME,SYSDBA from V$PWFILE_USERS;

USERNAME                 SYSDB

——————–            —–

SYS                              TRUE

NIMKAT                       TRUE

با اهدای مجوز sysdba به کاربری در بانک mydb2، آن کاربر هم خواهد توانست به بانک mydb1 متصل شود و به طور کلی، با استفاده از پسوردفایل یک بانک برای بانکی دیگر، امکان اتصال به بانک جدید از طریق کاربران حاضر در پسوردفایل، امکان پذیر خواهد بود حتی اگر بانک کاربری به ان نام نداشته باشد!!!

از دیگر موارد اثرگذار در استفاده و یا عدم استفاده از پسوردفایل، پارامتر REMOTE_LOGIN_PASSWORDFILE می باشد. این پارامتر سه مقدار به خود می گیرد:

none: عملا از پسوردفایل استفاده نخواهد شد و امکان لاگین از راه دور از طریق admin privilegeها از بین خواهد رفت:

SQL> alter system set remote_login_passwordfile=none scope=spfile;

System altered.

SQL> startup force;

[oracle@myhost ~]$ sqlplus “sys/myname_is_123@192.168.1.20:1521/mydb1 as sysdba”

SQL*Plus: Release 18.0.0.0.0 – Production on Sat Aban 26 15:14:11 1397

Version 18.3.0.0.0

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

ERROR:

ORA-01017: invalid username/password; logon denied

Enter user-name:

shared: با تنظیم پارامتر REMOTE_LOGIN_PASSWORDFILE به مقدار shared، پسوردفایل در حالت read only قرار خواهد گرفت:

SQL> alter system set remote_login_passwordfile=shared  scope=spfile;

SQL> startup force;

SQL> grant sysdba to usef;

ORA-01999: password file cannot be updated in SHARED mode

همچنین امکان استفاده از پسوردفایل توسط چند بانک به صورت اشتراکی بوجود خواهد امد.

exclusive: مثالهایی که در این متن مشاهده کردید، در حالتی بود که پارامتر REMOTE_LOGIN_PASSWORDFILE برابر با exclusive قرار داشت. در این حالت، امکان اهدای مجوز admin privilegeها به کاربران و یا سلب این مجوزها به وجود خواهد امد.

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *