veri̇tabani ve kullanici yöneti̇mi̇

22
Anar Godjaev http://anargodjaev.wordpress.com/ 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.

Upload: anar-godjaev

Post on 19-May-2015

222 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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.

Page 2: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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;

Page 3: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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,

UNIXSQL > CREATE USER ops$USER_NAME IDENTIFIED EXTERNALLY;SQL > CREATE USER ops$DENEME IDENTIFIED EXTERNALLY;SQL > GRANT CONNECT TO ops$DENEME;

-- WindowsSQL > CREATE USER "OPS$domain_name\TIM_HALL" IDENTIFIED EXTERNALLY;//domain iseSQL > CREATE USER "OPS$computer_name\TIM_HALL" IDENTIFIED EXTERNALLY;//domain değilseSQL > 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.

Page 4: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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.

Page 5: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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.

Page 6: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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,

Resource parameters Password parameters

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

Page 7: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

PASSWORD_GRACE_TIME UNLIMITED PASSWORD_VERIFY_FUNCTION NULL;

Sırayla Resource parametrelerinden başlıyarak bakacak olursak,

SESSIONS_PER_USEREşzamanlı olarak kullanıının açabileceği sssion sayısı

CPU_PER_SESSIONSaniyenin 100 de biri kadar biri süre içinde kullanıcının limitliyebileceği CPU zamanı.

CPU_PER_CALLparse, execute, fetch gibi işlemler için Saniyenin 100 de biri kadar kullanıcya verilecek limit.

CONNECT_TIMEKullanıcının bir session içinde geçirebileceği zaman ,dakika cinsinden.

IDLE_TIMEUzun sorgular için kullanışlıdır,yapılan işlemin ne kadar süre bekleneceğini saniye cinsinden gösterir

LOGICAL_READS_PER_SESSIONBir 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.

Page 8: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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/denemeERROR:ORA-28001: the password has expired

Changing password for denemeNew 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/passw0rdERROR:ORA-28000: the account is locked

SQL> alter user deneme account unlock;

SQL> connect deneme/passw0rdConnected.

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]

Page 9: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

Ö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 - ProductionWith the Partitioning, OLAP and Data Mining optionsSQL >

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.

Page 10: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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 SYSDBASQL > 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.

Page 11: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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

Page 12: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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 privilegesGö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

ConnectedSQL> 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:

Page 13: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith 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 userUSER 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

Page 14: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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/seconduConnected.SQL> show userUSER 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/firstuConnected.SQL> show userUSER 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/seconduConnected.SQL> show userUSER is "SECONDU"SQL> grant select,insert,delete on xx to firstu;

Page 15: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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.

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;

Page 16: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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 - ProductionWith 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/newuConnected.SQL> show userUSER 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

Page 17: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - ProductionWith 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 - ProductionWith 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/newuConnected.SQL> show userUSER is "NEWU"SQL> grant create user,create procedure,connect to newrole;

Grant succeeded.

SQL> show userUSER 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.

Page 18: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

SQL> select * from user_sys_privs where username = 'NEWU';

USERNAME PRIVILEGE ADM------------------------------ ---------------------------------------- ---NEWU CREATE USER YESNEWU UNLIMITED TABLESPACE NONEWU CREATE ROLE NONEWU 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/newuConnected.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;

Page 19: Veri̇tabani ve Kullanici Yöneti̇mi̇

Anar Godjaevhttp://anargodjaev.wordpress.com/

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.