VERİTABANI VE KULLANICI YÖNETİMİ


Oracle güvenlik konusunu çok ciddi olarak ele almaktadır.Hem kullanıcılar bazında hemde system bazında yeterli seviyede korunma birimleri vardır.
Bir veri tabanı ilk yaratıldığında bilinmesi gereken en önemli iki kullanıcı vardır.Biri SYSTEM diğeri SYS’dir.İkiside veritabanını yönetmek için full haklara sahiptir.Sys kullanıcısoyla bağlanabilmek için bağlantı cümlemizin sonuna AS SYSDBA eklemek zorundayız.Dediğimiz gibi SYS ve SYSTEM arasında veritabanını yönetmek açısından hiçbir fark yoktur.Tek fark sys user’ı sysdba haklarıyla bağlandığı için veritabanını kapatabilmekte fakat system user’ı kapatamamktadır.
İlk olarak güvenliğin en önemli prensibi olan kullanıcı yönetiminden başlamalıyız.
Bir kullanıcı nasıl yaratılır ve neler önemlidir diye bakacak olursak,
*Kullanıcının unique bir ismi olmalıdır.30 karakteri geçmemeli,özel karakterler kullanılmamalı yalnızca harf kullanılmalıdır.
*Authentication metodu dediğimiz hangi şekilde bağlanacağı belirlenmelidir.
*Kullanıcının Default data ve temp tablespace ‘i belirlenmelidir.
*Kullanıcı için profil belirlenmeldiir.
*Bir kullanıcı yaratılıp ,bu kullanıcı ile bir obje oluşturulursa artık bu kullancının bir SCHEMA ‘sı oluşur.Artık bundan sonra kullanıcınn objeleri değil,schemanın objeleri kavramını kullanacağız.
1
1
SQL > CREATE USER user_name IDENTIFIED BY password;
SQL > CREATE USER deneme IDENTIFIED BY deneme;
SQL > CREATE USER user IDENTIFIED {BY password | 
EXTERNALLY |GLOBALLY AS 'external_name'}
[DEFAULT TABLESPACE tablespace]
 [TEMPORARY TABLESPACE tablespace]
 [ { QUOTA {n [K|M] | UNLIMITED} ON
 tablespace } [, ... ] ]
 [PROFILE profile]
 } [ ... ];
Create user sysntax’ını yazdıktan sonra 3 alternatifimiz var,ya kullanıcya password verebilir,external seçeneğini seçip işletim sistemi yada 3.party bir sevisin haklarıyla bağlandırabilir yada global seçeneğini seçip,enterprise directory service hakları ile bağlandırabiliriz.
Şimdi bunun örneklerine sıra ile bakarsak,
Normal bir şekilde yani password kullanarak user yaratılması şu şekildedir.
SQL > CREATE USER deneme IDENTIFIED BY deneme;
Bunun dışında externally yani işletim sistemi yada 3. Part tooların verdiği haklarla user yaratmak istersek,
İlk olarak bakmamız gereken bir paramere olan os_authent_prefix ‘dir.

SQL> SHOW PARAMETER os_authent_prefix

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix                    string      ops$
SQL>
Buradaki ops$’ın anlamı user yaratırken ön takı olarak başına ops$ koyacağımız nalmaına geliyor.
Daha sonra "%ORACLE_HOME%\network\admin\sqlnet.ora" dosyasını açtığımızda ,
SQLNET.AUTHENTICATION_SERVICES= (NTS) satırının kesinlikle olması gerekmektedir.

Artık veritabanı kullanıcımızı yaratabiliriz.Fakat burada ikinci olarak dikkat edeceğimiz,Windows sistemlerde eğer makinamız domain’e bağlıysa bu domain name’ini kullanacağız,eğer bağlı değil ise makine ismini kullancağız,unix sistemlerde buna gerek yoktur.

Şimdi hem unix hemde windows istemler için örneklerimizi görelim,
UNIX
SQL > CREATE USER ops$USER_NAME IDENTIFIED EXTERNALLY;
SQL > CREATE USER ops$DENEME IDENTIFIED EXTERNALLY;
SQL > GRANT CONNECT TO ops$DENEME;
-- Windows
SQL > CREATE USER "OPS$domain_name\TIM_HALL" IDENTIFIED EXTERNALLY;//domain ise
SQL > CREATE USER "OPS$computer_name\TIM_HALL" IDENTIFIED EXTERNALLY;//domain değilse
SQL > CREATE USER "OPS$MAKINA1\DENEME" IDENTIFIED EXTERNALLY;
SQL > GRANT CONNECT TO "OPS$ MAKINA1\DENEME ";
Burada dikkat ettiyseniz user isimleri kesinlikle büyük harfle tanımlanmalıdır.
Windows sistemlerde kafamız domain mi kullancam yoksa local computer name kullanacağım diye karışsın istemiyorsanız,sqlplus “/as sysdba” ile bağlandığınızda aşağıdaki sorguyu çalıştırısanız size ne şekilde bağlanmanız yada kullanıcı yaratmanız gerektiğini söyleyecektir.
SQL> select UPPER(sys_context('userenv','os_user')) from dual;
 
UPPER(SYS_CONTEXT('USERENV','OS_USER'))
 -------------------------------------------------------------------
 MAKINA1\Administrator
Bu işlemleri bitirdikten sonra artık işletim sistemi tarafında kullanıcı yaratmamız gereklidir.Yine aynı şekilde unix ve windows sistemler için durum farklıdır.Kullanıcı isimlerini mümkünse yine büyük harfle tanımlıyoruz.
1
Yukarıdaki örnek windows sistmeler içindir.Unix sistemlerde ise /etc/passwd altına bir user eklemek yeterlidir.
Bundan sonraki adım ise hangi user’ı yarattıysak o user ile işletim sistemine login oluyoruz.Daha sonra command’ı açıp sadece sqlplus / yada sqplus /@service_name(bu isim tnsnames.ora daki isimdir) yazmak yeterlidir.
1
Windows sistemlerde eğer domain kullanıcılarının uzaktan bağlanabilmeleri isteniyorsa remote_os_authent parametresinin değeri TRUE olmalıdır.Default’u false tur
 
SQL>ALTER SYSTEM SET REMOTE_OS_AUTHENT=TRUE SCOPE=SPFILE ;
 SQL>SHUTDOWN IMMEDIATE ;
 SQL>STARTUP;
Bir diğer authentication şekli olan GLOBALLY kavramına bakarsak bu tamamen enterprise directory service hakları ile bağlanmayı gerektirir.Genellikle OID dediğimiz Oracle Internet Directory yapısında kullanılır.Bunun için NETCA tanımlarında ya Oracle Internet Directory yada Microsft active directory yapısını kullanabiliriz.Önemli bir konudur fakat çok uzun anlatılması gerekir.
Bunun için bir kullancı tanımına bakacak olursak,
SQL>CREATE USER DENEME
   IDENTIFIED GLOBALLY AS 'CN=analyst, OU=division1, O=oracle, C=US'
   DEFAULT TABLESPACE example
   QUOTA 5M ON example;
Authentication konusunu tamamladıktan sonra kullanıcı tanomlarken gerekli olan diğer konulara bakabiliriz.
[DEFAULT TABLESPACE tablespace]
 [TEMPORARY TABLESPACE tablespace]
Default tablespace yaratacağımız kullanıcının objelerini muhafaza etmek için hangi tablespace’i kullanacağını belirlememize yarar.Çoğu iyi tasarlanmış sistemlerde ilk önce tablespace daha sonra kullanıcı tanımlandığı için user yaratma aşamasında rahatlıkla belirtebiliriz.Diğer’i ise TEMPORARY olarak hangi tablespace’i kullanacağıdır.Eğer boş bırakırsak Veirtabanının default temp tablespace’ini kullanır ama istenirse yeni bir temp tablespace yaratılıp bu kullanıcı için kullanılsın denilebilir.Genellikle ilgili luser yaptığı sıralama işlemlerinde kullanılacaktır.
Önceki gördüklerimizle bir karşılaştırma yapacak olursak,bir database’de aktif olarak birden fazla TEMP Tablespace kullanılabilir,ama tüm kullanıcılar için undo tablespace tektir.Bunu unutmamaka gerekir.
SQL>CREATE USER DENEME
               IDENTIFIED BY SIFRE
               DEFAULT TABLESPACE DENEME_TAB
               TEMPORARY TABLESPACE TEMP;
Sırada göreceğimiz profile ve kota kavramları var,
[ { QUOTA {n [K|M] | UNLIMITED} ON
 tablespace } [, ... ] ]
 [PROFILE profile]
QUOTA’nın anlamı oluşturacağımız kullanıcının ilgili tablespace üzerinde ne kadarlık bir obje barındırma hakkı olsun dediğimizde kullanıyoruz,Eğer unlimeted verirsek sınırsız olarak kullanabilir.
Profile ise sistem üzerinde default profiller olduğu gibi biz kendimiz profile tanımlayarak kullanıcının oturumunu yönetebiliyoruz.Örneğin kullanıcı kaç sefer yanlış şifre girdiğinde lock lansın,şifre uzunluğu ne olsun,ne kadar süre bağlı kalabilsin gibi.Bir çok senaryo mevcuttur.Gerçekten kullanışlı bir opsiyondur.
Örneğin yeni bir profile oluşturma olayına bakacak olursak,
1
11
Yukarıda görüldüğü gibi birçok parametre baz alınarak profile tanımı yapılabilir.
Veritabanı ilk kurulduğunda default isimle gelen profilin yapısı şu şekildedir.

SQL > CREATE PROFILE DEFAULT LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
CONNECT_TIME UNLIMITED
IDLE_TIME UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
COMPOSITE_LIMIT UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;
Sırayla Resource parametrelerinden başlıyarak bakacak olursak,
SESSIONS_PER_USER
Eşzamanlı olarak kullanıının açabileceği sssion sayısı
 CPU_PER_SESSION
Saniyenin 100 de biri kadar biri süre içinde kullanıcının limitliyebileceği CPU zamanı.
 CPU_PER_CALL
parse, execute, fetch gibi işlemler için Saniyenin 100 de biri kadar kullanıcya verilecek limit.
 CONNECT_TIME
Kullanıcının bir session içinde geçirebileceği zaman ,dakika cinsinden.
 IDLE_TIME
Uzun sorgular için kullanışlıdır,yapılan işlemin ne kadar süre bekleneceğini saniye cinsinden gösterir
 LOGICAL_READS_PER_SESSION
Bir session içinde ne kadarlık data bloğu okunabileceğini limitler
 LOGICAL_READS_PER_CALL
parse, execute, fetch anında ne kadarlık databloğu okunacağını limtler
 PRIVATE_SGA
İstenirse kullanıcı için byte cinsinden özel bir SGA alanı tahsis edilebilir.
Passowrd paramerelerine bakacak olursak,
FAILED_LOGIN_ATTEMPTS
Kullanıcın login olmadan önce lock olana kadar kaç deneme yapabileceğini gösterir
 PASSWORD_LIFE_TIME
Gün cinsinden parolanın ne kadar süre geçerli olacağını gösterir.
PASSWORD_LOCK_TIME
Parolanın ne kadar gün sonra lock edileceğini belirler.

SQL > CREATE PROFILE new_profile
  PASSWORD_LIFE_TIME 10
        FAILED_LOGIN_ATTEMPTS 5;

SQL > CREATE PROFILE app_user LIMIT 
   SESSIONS_PER_USER          UNLIMITED 
   CPU_PER_SESSION            UNLIMITED 
   CPU_PER_CALL               3000 
   CONNECT_TIME               45 
   LOGICAL_READS_PER_SESSION  DEFAULT 
   LOGICAL_READS_PER_CALL     1000 
   PRIVATE_SGA                15K;

Daha sonra ise kullanıcı tanımlarken bu profilleri kullanıcıya atayabiliyoruz.

SQL > CREATE USER app_user1
   IDENTIFIED by oracle
   DEFAULT TABLESPACE example
   QUOTA 5M ON example
   PROFILE app_user;

SQL > CREATE USER new_user_orakleci
   IDENTIFIED by oracle
   DEFAULT TABLESPACE example
   QUOTA 5M ON example
   PROFILE new_profile;

Bunuda gördükten sonra user yaratırken iki kavram daha kalıyor ACCOUNT LOCK yada UNLOCK ve PASSWORD expire kavramı.

Kullanıcı yaratırken istersek kitli yaratıyoruz,isetersek kilitsiz yaratbiliyoruz.Kilitli ise kullanıcı login olduğunda oturum kilitli lütfen kilidi açın gibi bir uyarı alınır.Kullanıcı kendi kilidini açamayacktır.Bunu yetkili bir başka kullanıcı açtıktan sonra kilitli kullanıcı artık bağlanabilecektir.Bu paramrenin default’u UNLOCK olarak tanımlıdır.

Pasword expire seçeneğini aktif hale getirisek kullanıcı login olduğunda şirefsini değiştirmesi istenecek ve kullanıcıda bunu değiştirecektir.

SQL> create user deneme identified by deneme password expire;

SQL> connect deneme/deneme
ERROR:
ORA-28001: the password has expired

Changing password for deneme
New password:

Yukarıdaki örnekte görüldüğü gibi kulalncıdan yeni şifre girmesi istenmiştir.

Alttaki örnek ise kilitli olarak yaratılan bir kullanıcının nasıl kullanılacağı ile ilgilidir.Kullanıcı kilitlidir ve bağlanmak istediğinde hata almıştır.Başka bir yetkili kullanıcıyla bu kilidi açıyoruz ve kullanıcı tekrar denediğinde artık bağlanabiliyor.

SQL> create user deneme identified by passw0rd account lock;

SQL> connect deneme/passw0rd
ERROR:
ORA-28000: the account is locked

SQL> alter user deneme account unlock;

SQL> connect deneme/passw0rd
Connected.

Buraya kadar anlatılan işlemlerle bir kullanıcının nasıl yaratılacağını gördük.Peki oluşturulan kullanıcı sisteme nasıl bağlanıyor diye bakacak olursak.

$sqlplus kullanici/sifre [as sysdba/sysoper]
Örneğin denem isimli bir kullanıcı ve şifresi deneme_sifre olan bir kullanıcı ile bağlanmak isteyelim.
$sqlplus deneme/deneme_sifre
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL > 
 
Bağlantı bu şekilde sağlanacaktır.Peki buradaki as sysdba yada as sysoper nedir diye bakacak olursak.SYSDBA hakkı sistemde sysdba hakkına sahip olan kullanıcların bağlanma şeklidir.Bu hakka SYS kullanıcısı sahiptir.SYS kullanıcısı SYSDBA opsiyonu dışında normal olarak bağlanamaz.SYSDBA ile bağnalıldığında sistem üzerinde yapılamayack işlem yoktur.Her kullanıcı SYSDBA opsiyonu ile bağlanamaz sadece bu hakka sahip olanlar bağlanabilir.Bu hakta SYSDBA hakkına sahip olan bir kullanıcı ile başka bir kullanıcıya şu şekilde verilir.
SQL > grant sysdba to kullanici_adi;
Şimdi SYSDBA hakkı ile SYSOPER arasında ne gibi farklar var diye bakacak olursak,
SYSDBA
STARTUP ve SHUTDOWN işlemini gerçekleştirebilir.
ALTER DATABASE komutu ile beraber : open, mount, back up, yada change character set yapabilir.
CREATE DATABASE yapabilir.
DROP DATABASE yapabilir.
CREATE SPFILE yapabilir.
ALTER DATABASE ARCHIVELOG yapabilir.
ALTER DATABASE RECOVER yapabilir.
SYSOPER
STARTUP ve SHUTDOWN işlemini gerçekleştirebilir.
CREATE SPFILE yapabilir.
ALTER DATABASE OPEN/MOUNT/BACKUP yapabilir.
ALTER DATABASE ARCHIVELOG yapabilir.
ALTER DATABASE RECOVER (Yalnızca tam recovery dediğimiz işlemi yapabilir. INCOMPLATE RECOVERY dediğimiz UNTIL TIME|CHANGE|CANCEL|CONTROLFILE işlemlerini yapamaz,bunları yapabilmek için SYSDBA olmak gereklidir.)
Görüldüğü üzere aralarında birkaç ciddi fark vardır.
Bazen dikkat edilirse işletim sisteminden aşağıdaki komutu kullanarak kullanıcı adı şifre girmeden ama sysdba yada sysoper ile veritabanına connect olabilmekteyiz.Peki bu nasıl olmaktadır.
Mesela,
$ sqlplus “/as sysdba” yazdığımızda bağlanabilmekteyiz.Bunu yapabilmemizi sağlayan işletim sistemine connect olduğumuz kullanıcının windows sistemlerde ORA_DBA unix sistemlerde ise DBA grubuna dahil olmasınla olur.sysoper için ise windows sistemlerde ORA_OPER ,unix sistemlerde OPER grubu ile gerçekleşmektedir.Bu gruba dahil olunmayan işletim sistemi kullanıcılarınla bağlanıldığında bu işlemi gerçekleşitiremeyiz.
Peki bunun dışında uzaktaki bir sistemden bir veritabanına / as sysdba haklarıyla nasıl bağlanırız diye bakacak olursak bu biraz daha farklıdır.
Buna Oracle dilinde REMOTE_LOGIN_DATABASE diyoruz.
SQL > CONNECT /@net_service_name AS SYSDBA
SQL > CONNECT /@net_service_name AS SYSOPER

Yukarıdaki bağlantı şekliye bağlanabilmemiz için veritabanı üzerinde çeşitli parametrelerin aktif olması gereklidir.

REMOTE_LOGIN_PASSWORDFILE adını verdiğimiz parametrenin değerinin EXCLUSIVE olması gereklidir.Veritabaında default olarak bu şekildedir fakat NONE yada SHARED ise  bu değere set edilmesi gereklidir.
 
Tabi ki bunu yapmakta yetmeyecektir bunun dışında Passwordfile adını verdiğimiz bir file vardır.Bu file’ın yaratılmış ve düzgün ayarlanmış olması gereklidir.Eğer yoksa şu şekilde ayarlayabiliriz.

$ ORAPWD FILE=filename PASSWORD=password ENTRIES=max_users force=<y/n>
Buradakilerin anlamı,

FILE = Passord file’ın ismi,direk olarak dosya ismi verilebileceği gibi bir path’le de birlikte verilebilir.Girilmesi zorunludur.

PASSWORD=sys user’ı için password belirlenir.Eğer daha öneden bir password file’ımız var ve kullanılıyorsa ALTER USER komutu ile sys kullanıcısının şifresini değiştirdiğimizde password file danda şifre güncellenir.İlk defa password file yaratacaksak burada verdiğimiz şifre veritabanı içinde geçerlidir.Girilmesi zorunludur.Eğer veritabanı üzerinde REMOTE_LOGIN_PASSWORDFILE parametresi SHARED ise sys kullanıcısının şifresi değiştirilemez.

entries – Farklı olarak DBA yada operlardan max ne kadar kabul edileceği

force – Mevcut dosyanın üzerine yazılıp yazılmayacağı

Dikkat edilmesi gereken = karakterlerinden sonra boşluk olmamalıdır.
Veritabanı üzerinde REMOTE_LOGIN_PASSWORDFILE parametresi için üç tip bilgi set edileebilir.Bunlar ve özelliklerine bakacak olursak,
 
NONE: parametre değerinin bu şekilde olması ile güvenli olmayab hiçbir bağlantıya izin verilmeyecektir.
EXCLUSIVE: Parametrenin bu değeri ile password file ‘ın ve içindeki kullanıclarla güvenli şekilde bağlanabileceği anlamına gelir.
SHARED: Genellike birden fazla instance ‘ın olduğu RAC sistemlerinde kullanılır.Aslında amaç password file’ın paylaşılmasıdır.Hiçbir şekilde SYSDBA yada SYSOPER hakkına sahip kullanıcıların(sys dahil) şifresi değiştirilemez,yeni Özel haklara sahip olacak(SYSDBA,SYSOPER) kullanıcı eklenemez.Yapabilemk için parametreyi EXCLUSIVE’e çevirmeli işimiz bitiiğinde tekrar SHARED konumuna alınabilir.
Veritabanına yeni bir SYSDBA yada SYSOPER hakkına sahip olacak kullanıcı eklendiği zaman otomatik olarak password file’a yazılır.
Password file içinde tanımlı kullaıcılar ve haklarını görmek için V$PWFILE_USERS view’ı kullanılabilir.
 
Şimdi artık kullanıcılarımızı düzgün şekilde yarattığımıza gore kullancıların sisteme ve system objelerine hangi haklarla bağlandığına ve bu hakların nasıl ayarlandığına bakabiliriz.
Bu hakların ilk adımı olan privileges kavramına bakabiliriz.Privileges system privileges ve objects privileges olarak ikiye ayrılır.
System privileges system üzerinde bazı işlemleri yapabilmeyi kullanıcılara sağlar.Başlıca privilegeslara bakacak olursak,
– CREATE SESSION = En önemli haklardan biridir,bu hakka sahip olmayan bir kullanıcı veritabanına bağlantı kuramaz.
– CREATE TABLE = Kendi Scheması ve tablespace’I dahilinde tablo yaratabilme  iznidir.
– CREATE ANY TABLE = Kendi scheması ve diğer schemalar için tablo yaratabilme iznidir.Bir iznin önünde ANY varsa kendi scehamsı ve diğer schemalar içinde anlamına gelir.
– CREATE SEQUENCE = Artan sırada ardaşık sayı grubu oluşturmak için gereken haktır.
– CREATE VIEW = View oluşturabilmek için gereken haktır.
– CREATE INDEX = Index oluşturabilmek için gerekli haktır.
– CREATE PROCEDURE = Kendi scheması içinde procedure oluşturabilmek için gerekli haktır.
– CREATE ANY PROCEDURE = Kendi scheması ve diğer schemalarda procedure oluşturabilmek için gerekli haktır.
– CREATE ROLE = Role yaratabilmek için gerekli haktır.
– CREATE USER = Kullanıcı yaratabilmek için gerekli haktır.
– CREATE TRIGGER = Trigger yaratabilmek için gerekli haktır.
– CREATE PROFILE = Profile yaratabilmek için gerekli haktır.
– ALTER USER = Kullanıcı ile ilgili değişiklik yapacağımız zaman gerekli olan bir izindir.
– ALTER ANY TABLE = Tablolarla ilgili bir değişiklik yapacağımız zaman gerekli olan bir izindir.
– DROP ANY TABLE = bir tabloyu sileceğimiz  zaman gerekli olan bir izindir.
– EXECUTE ANY PROCEDURE = Bir prosedürü çalıştırabilmek için gerekli haktır.
– SELECT ANY TABLE = Kendi scheması ve diğer schemalar için sorgulama yapabilme iznidir.
Burada örnek olarak verdiğimiz izinlerin dışında yaklaşık olarak 160-170 arası system izinleri vardır.Bu İzinler nelerdir diye görmek istersek,
SQL > select distinct(PRIVILEGE) from Dba_sys_privs order by PRIVILEGE;
Sorgusunu kullanabiliriz.
Şimdide bu hakların kullanıclara nası verildiğine bir bakarsak,
SQL > create user deneme identified by deneme;
SQL > grant create session to deneme;
SQL > grant create table to deneme;
$ sqlplus deneme/deneme
Connected
SQL> create table hh(aa varchar2(20));
Table created.
SQL> create table baska_schema.hh(aa varchar2(20));
create table baska_schema.hh(aa varchar2(20))
*
ERROR at line 1:
ORA-01031: insufficient privileges
Görüldüğü gibi başka bir kullanıcının schemasına obje yaratmak istediğimizde hata aldık.O yüzden yetkili bir kullanıcı ile deneme kullanıcısına CREATE ANY TABLE hakkı verip tekrar deniyoruz.
SQL > exit;
$ sqlplus “/as sysdba”
Connected
SQL > grant create table to deneme;
SQL > exit;
$ sqlplus deneme/deneme
Connected
SQL> create table baska_schema.hh(aa varchar2(20));
Table created.
Görüldüğü gibi bu örnekten ANY ile ve ANY siz olarak izinlerin farkını anlayabiliriz.
Bir kulalncıya toplu olarak system izinlerini vermek istiyorsak,
SQL > grant create table,alter any table,drop user,execute any procedure to deneme;
Şeklinde kullanabiliriz.
Buraya kadar anlatılanlar system üzerinde var olan izinlerdi,bir diğer izin şeklide obje privilige’I olarak adlandırıyoruz.Oda şu şekilde oluyor,Örneğin bizim kullanımızın ismi firstu olsun,başka bir kullanıcı daha belirleyelim onun ismide secondu olsun.Normalde eğer obje izinleri yoksa bir kullancı başka bir kullancının objelerine erişemez.Şu şekidle bir örnekle anlatmaya çalışırsak.
1)İlk olarak yetkili bir kullancı ile sisteme bağlanıyoruz
 
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 15:42:07 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
2)İlk kullanıcımızı yaratıyoruz.
SQL> create user firstu identified by firstu;
User created.
3)Kullanıcıya sisteme bağlanabilmesi için create session hakkı veriyoruz.
SQL> grant create session to firstu;
Grant succeeded.
4)Daha sonra ikinci kullanıcımızı yaratıyoruz.
SQL> create user secondu identified by secondu;
User created.
5)İkinci kullanıcıya tablo yaratbilme hakkı olan create table,oturum açabilme hakkı olan create session ve bağlı olduğu tablespace’te yazabilme hakkı olan resource veriyoruz.
SQL> grant create session,create table,resource to secondu;
Grant succeeded.
6)sqlplus tan çıkmadan ikinci kullanıcı ile bağlanıyoruz.
SQL> conn secondu/secondu;
Connected.
SQL> show user
USER is "SECONDU"
7)ikinci kullanıcı ile bir tablo yaratıp içine bir staırlık bir bilgi giriyoruz.
SQL> create table xx(aa varchar2(5));
Table created.
SQL> insert into xx values ('HH');
1 row created.
SQL> commit;
Commit complete.
8)Daha sonra birinci kullanıcı ile bağlanıyoruz sqlplus tn çıkmadan.
SQL> conn firstu/firstu;
Connected.
SQL> show user
USER is "FIRSTU"
9)Aşağıdaki sorguyu çalıştırmasını istiyoruz,kullanıcı bunu çalıştıryor fakat hata alıyor çünkü birinci kullanıcının ikinci kullanının tablosunda select izni yok.
SQL> select * from secondu.xx;
select * from secondu.xx
*
ERROR at line 1:
ORA-00942: table or view does not exist
10)İkinci kullanıcı ile bağlanıp kendi tablosuna birinci kullanıcının bağlanıp select yapabilmesi için gerekli izni veriyoruz.
SQL> conn secondu/secondu
Connected.
SQL> show user
USER is "SECONDU"
SQL> grant select on xx to firstu;
Grant succeeded.
11)birinci kullanıcı ile tekrar bağlanıp aynı sorguyu tekrar denediğimizde artık select yapabildiğimizi görüyoruz.
SQL> conn firstu/firstu
Connected.
SQL> show user
USER is "FIRSTU"
SQL> select * from secondu.xx;
AA
-----
HH
12)Bu sefer birinci kullanıcı ile ikinci kullanıcının tablosuna insert yapmayı denedğimizde hata alıyoruz bunun sebebide birinci kullanıcının ikinci kullanıcının tablsounda insert yapmaya hakkı olmadığını görüyoruz.
SQL> insert into secondu.xx values ('JK');
insert into secondu.xx values ('JK')
*
ERROR at line 1:
ORA-01031: insufficient privileges
12)Bu sefer ikinci kullanıcı ile bağlanıp hem insert hemde delete hakkı verip bu işi bitiriyoruz.Denemesinide size bırakıyorum.
SQL> conn secondu/secondu
Connected.
SQL> show user
USER is "SECONDU"
SQL> grant select,insert,delete on xx to firstu;
Obje ve system bazında nasıl izinlerin verildiğini gördük ,komutumuz grant idi,peki verilen izinleri geri almak istersek ne yapmamız gerekir,bunun komutuda REVOKE tur.
Örnek olarak bakarsak,
SQL> revoke create any table from deneme1;
SQL> revoke execute any procedure from deneme;
SQL> revoke select on xx from firstu;
 
Kullanım şekli yukarıda görüldüğü kadar basittir.
Obje ve system izinlerini gördük,bunları kullanmak aslında hiç te kolay değil,bunları tek tek kullanıcılara vermek biraz zahmetli olabilir.Oracle’I yazanlar role diye bir kavram düşünmüşler.Örneğin bir şirketimiz var,yaklaış 100 adet kullanıcı olsun,ve şirketin 5 departmanı olsun.Bu 5 departmanın görevleri farklı olsun ama aynı departmanda çalışanların görevleri aynı olsun.Şimdi Oracle’da bu 100 kullanıcyı yaratıp her kullanıcı için tek tek bu izinleri vermek zahmetli olabileceği gibi gözden kaçacak şeylerde olabilir.İlerleyen günlerde bu 100 kullancıya yeni bir görev vermek istersek tek tek yazmamız gerekir.Yada kullanıcı departman değiştirecekse once bütün hakları geri alıp daha sonra diğer departmanın haklarını vrmek gerekir.
1
Bunun çok zahmetli olacağı bellidr.Onun için ROLE denen kavramı kullanmak daha akılcıdır.
Privillege larda olduğu gibi role lar içinde system tarafından hazırlanmış olan ROLE ler ve bizim tanımlayacağımız olan ROLE ler mevcuttur.
Örneğin system tarafından hazırlanmış ROLE’ler nelerdir diye bakacak olursa birkaç örnekle üzerinden geçebiliriz.
CONNECT = içinde connect session iznini barındırır.
DBA = Hemen hemen tüm izinleri bünyesinde barındırır.Bu role’e sahip olan kullanıcı hemen hemen herşeyi yapabilir.O yüzden çok tehlikelidir.
RESOURCE = Bu ise içinde CREATE TABLE,CREATE TYPE.. gibi iznleri barındırır.Bu roel önemlidir zira ilgili tablespace üzerind eyazma yapabilemk için gereklidir.
Peki bir system role’ü kullanıcya nasıl verilir.
SQL> grant connect,resource to deneme;
Kullanımı aynı privillege’ta olduğu gibidir.Peki system role’lerinin dışında kendimize ait role nasıl tanımlayabiliriz diye bakarsak ilk olarak kullanıcının ihtiyacı olan create role hakkına sahip olmasıdır.Bunun dışındakileri bir örnekle sıralayacak olursak,
1-)İlk olarak yetkili bir kullanıcı ile bağlanıyoruz.
 
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 17:15:37 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
2-)Daha sonra bir kullanıcı yaratıyoruz.
SQL> create user newu identified by newu;
User created.
3-)Kullanıcıya çeşitli role ler için hak tanımlıyoruz.
SQL> grant connect,resource,create role,create user,create procedure to newu;
Grant succeeded.
4-)Tanımladığımız kullanıcı ile bağlanıp ,bu kullanıcı ile yeni bir role yaratıyoruz.
SQL> conn newu/newu
Connected.
SQL> show user
USER is "NEWU"
SQL> create role newrole;
Role created.
5-)Daha sonra kullanıcımız ile sahip olduğumuz haklardan iki  tanesini role’e atamak istiyorz fakat hata alıyoruz.Bunun sebebi kullanıcı o haklara sahip fakat sahip olduğu hakları başka bir role’e yada kullanıcıya atama hakkına sahip değil.Bunuda şu şekilde hallediyoruz.
SQL> grant create user,create procedure,connect to newrole;
grant create user,create procedure to newrole
*
ERROR at line 1:
ORA-01031: insufficient privileges
6-)Ytekili sys kullanıcısı ile bağlanıp newu userına sahip olduğu hakları dağıtabilmesi için admin option veriyoruz.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Pr
oduction
With the Partitioning, OLAP and Data Mining options
$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 14 17:18:49 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> grant create user,create procedure,connect to newu with admin option;
Grant succeeded.
7-)Aynı işlemi newu user’I ile tekrar denediğimizde işlemin başarılı olduğunu görüyoruz.Artık newu user’I bir role oluşturdu ve sahip olduğu izinleri bu role’e atayabildi.
SQL> conn newu/newu
Connected.
SQL> show user
USER is "NEWU"
SQL> grant create user,create procedure,connect to newrole;
Grant succeeded.
SQL> show user
USER is "NEWU"
8-)Daha sonra newu user I ile yeni bir kullanıcı tanımlıyoruz ve tanımlanan role’U yeni tanımlanacak kullanıcya atıyoruz.
SQL> create user xxu identified by xxu;
User created.
SQL> grant newrole to xxu;
Grant succeeded.
9-)Aşağıdaki sorgularla NEWU ve XXU kullanıcları için sahip olunan privilege ve role’leri  görebiliriz.
1
SQL> select * from user_sys_privs where username = 'NEWU';
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
NEWU                           CREATE USER                              YES
NEWU                           UNLIMITED TABLESPACE                     NO
NEWU                           CREATE ROLE                              NO
NEWU                           CREATE PROCEDURE                         YES
SQL> conn xxu/xxu;
Connected.
SQL> select * from user_sys_privs where username = 'XXU';
USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
XXU                            CREATE SESSION                           NO
SQL> select * from user_role_privs where username ='XXU';
USERNAME                       GRANTED_ROLE                   ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
XXU                            NEWROLE                        NO  YES NO
SQL> conn newu/newu
Connected.
SQL> select * from user_role_privs where username ='XXU';
no rows selected
Bu komutlar dışında çeşitli alter komutlarıyla kullanıcılar için işlemler yapabiliriz.
Örneğin bir kullanıcının şifreisni değiştirmek istedik diyelim.
SQL > alter user newu identified by yeni_sifre;
Yada bir kullanıcıyı lock layalım yada lock’ını kaldıralım.
SQL > alter user newu account lock;
SQL > alter user newu account unlock;
Kullanıcının default tablespace’ini değiştirmek isteyelim.
SQL > alter user newu default tablespace DENEME;
Bunun dışında birçok etkili komut kullanılıp denenbilir.
Bunların dışında en dikkat edeceğimiz konulardan biride SYS schemasına ait data dictionary dediğimiz objelerin UPDATE edilememsidir.bu tablolara dokunulmasını istemiyorsak O7_DICTIONARY_ACCESSIBILITY adlı parametrenin değerini FALSE olarak ayarlamalıyız.

2 comments

  1. Kafamdaki bi sorunun cavabını buldum bu makalede. Teşekkürler iyi çalışmalar.

  2. Rica ederim. Kolay gelsin

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: