Linux İptables Kullanımı ve Yapılandırılması

İptables linux işletim sistemlerine entegre bir şekilde gelen güvenlik duvarı yazılımıdır. İptables ile sunucuya gelen trafikleri kontrol edebilir veya başka bir adrese yönlendirebilirsiniz.

Bu yazıda sizinle ayrıca sunucunuza yapılan brute force atackları engelleyebilmeniz için küçük bir bash komutu paylaşacağım.

iptables yazılımı linuxt işletim sisteminize kurulu değil ise aşağıdaki şekilde kurabilir başlangıçta otomatik başlaması için ayarlama yapabilirsiniz.

# yum install iptables

veya 

# apt install iptables

Başlangıçta otomatik başlaması veya başlamaması için aşağıdaki komutu çalıştırabilirsiniz.

Sunucu yeniden başladığında iptables otomatik başlar
# chkconfig iptables on

Sunucu yeniden başladığında iptables başlamaz
# chkconfig iptables off

İptables yazılımında gelen veya giden trafik ile ilgili tanımlara aşağıdaki şekilde bakabilirsiniz.

 # iptables -L
 Chain INPUT (policy ACCEPT)
 target     prot opt source        destination
 

 Chain FORWARD (policy ACCEPT)
 target     prot opt source        destination
 

 Chain OUTPUT (policy ACCEPT)
 target     prot opt source         destination

Bu listede INPUT gelen, OUTPUT giden ve FORWARD yönlendirilmiş tanımları ifade eder ve eğer bir kural varsa buradan görebilirsiniz.

Yeni bir kural eklendiğinde target ile ilgili aşağıdaki tanımlamaları yapabilirsiniz.

ACCEPT: Paketlerin geçisine izin verilir.
REJECT: Paketlerin erişimi reddedilir.
DROP: Paketlerin geçişine izin verilmez.
RETURN: Zincirin sonuna gönderilir.
QUEUE: Paketler kullanıcı alanına gönderilir.

Örnek olarak belirli bir ip den gelen paketlerin erişimini kısıtladığımızda liste aşağıdaki şekilde olacaktır.

# iptables -A INPUT -p tcp -s x.x.x.x -j DROP 
# iptables-save  

Belirli bir ip nin sunucuya erişimini kısıtladığımızda bu kural aşağıdaki şekilde görünecektir. x.x.x.x ip’sinin sunucuya gönderdiği tüm TCP paketler sunucu tarafından kabul edilmeyecektir.

# iptables -L

 Chain INPUT (policy ACCEPT)
 target     prot opt source     destination
 DROP       tcp  --  x.x.x.x    anywhere
 

 Chain FORWARD (policy ACCEPT)
 target     prot opt source     destination
 

 Chain OUTPUT (policy ACCEPT)
 target     prot opt source     destination

Burada gönderilen paketler port farketmeksizin engellenecektir. Belirli bir port veya başka bir protokol belirterek gelen paketleri engellemekte mümkün. tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh protokolleri için tanımlama yapabilirsiniz. Örneğin belirli bir portu engellemek için aşağıdaki komutu kullanabilirsiniz.

# iptables -A INPUT -p tcp --dport 22 -s x.x.x.x -j DROP 
# iptables-save 

Bu işlemin ardından x.x.x.x ip’si sunucuya 22 portundan erişemeyecektir.

Belirli bir subnet’i engellemek için aşağıdaki gibi ip adresin sonuna /subnet ekleyerek tanımlama yapabilirsiniz.

# iptables -A INPUT -p tcp --dport 22 -s x.x.0.0/16 -j DROP 

# iptables -A INPUT -p tcp --dport 22 -s x.x.x.0/24 -j DROP 

# iptables-save 

Örneğin belirli bir ip grubunu engelleyip engellenen ip grubu içerisinden tek bir ip’ye erişim vermek istersek bunu aşağıdaki şekilde yapabiliriz.

# iptables -A INPUT -p tcp --dport 22 -s x.x.0.0/16 -j DROP 

# iptables -A INPUT -p tcp --dport 22 -s x.x.x.x -j ACCEPT 

# iptables-save 

Bir kural tanımladıktan sonra mutlaka iptables-save komutunun çalıştırılması gerekmektedir. Varolan tüm kuralları temizlemek için iptables -F komutu kullanılabilir. Bu işlem sonrası tanımlanmış olan tüm kurallar silinecektir.

# iptables -F

İptables ile ilgili diğer parametreleri görmek kullanıcı kılavuzu sayfasını inceleyebilirsiniz.

# man iptables

SQL Tune Nasıl Yapılır

Bu yazıda bir sql’i tune edip sorgu sonucunun hızlandırılması konusunda index ekleme yöntemini açıklayacağım. Burada anlatacağım yöntemi oracle, postgresql, mysql ve diğer veritabanlarında kullanabilirsiniz.

İlk olarak index nedir ve neden eklenmesi gerektiğini açıklamak istiyorum. İndex oluşturulmuş bir ağaç yapısıdır ve birden çok index türü vardır. B-tree index yapısını aşağıdaki şekilde inceleyebilirsiniz. Leaf block dediğimiz yerde ilgili tablonun içerisindeki rowların id leri bulunmaktadır. Bunu adres olarak düşünebiliriz. Branch blocks dediğimiz yer ise datanın belirli bir düzene göre gruplandığı yerdir. Aşağıdaki resimde görebileceğiniz gibi job_id kolonunda 2 değerine sahip satırların id numaraları bir blokta tutulmuş. Bu da job_id = 2 koşulu istendiğinde tabloyu full okumak yerine sadece ilgili bloklara gidip okuma yapacağı anlamına gelmektedir.

Tablo full okunmadığı için ilgili sql daha hızlı sonuç üretecektir. Daha hızlı sonuç üretmesi veritabanının fazla efor harcamamasına ve daha performanslı çalışmasına neden olacaktır.

Çok fazla transaction alan veritabanlarında sql’lerin sorgu sonuç süreleri kritik bir öneme sahiptir. Şu şekilde bir hesap yapacak olursak daha anlaşılır olacaktır. Elimizde çalışması 1 sn süren bir sql olsun ve bu sql uygulamadan veritabanına 10 bin kez gönderilsin. Bu işlem veritabanında 1 sn* 10 bin kez çalışacaktır ve veritabanını toplamda 10 bin saniye / 60 = 166 dakika meşgul edecektir. Tabi cpu’nun saniye de milyarlarca işlem yapabildiği için gerçek hayatta bu işlem 166 dakikada sürmeyecektir.

İlgili sql’e index ekleyip çalışma süresini yarıya düşürdüğümüzü varsayarsak toplamda 83 dakika kazanmış olacağız ki bu muazzam bir süre. Bu örnekte saniyeler üzerinden gidiyorum fakat sql’lerin veritabanında çalışma süreleri mili saniyeleri geçmemesi gerekiyor. 0.5 saniye bile bir sorgu için aşırı büyük bir değer.

Şimdi veritabanının bir sorguyu çalıştırırken sonucu getirmek için izlediği yolu göstereceğim. Örnek olarak elimizde aşağıdaki gibi bir sql sorgusu olsun.

select firts_name, last_name from hr.employee where job_id = 2;

Bu sql’i veritabanı şu şekilde yorumlayacaktır:

– job_id kolonunda değeri 2 olan
– hr.employee tablosundaki
– first_name ve last_name kolonundaki tüm verileri getir.

Sorgu bizim aksimize tersten okunarak istenilen dataları getirmek için işlenmeye başlandı. Bu kısımda job_id kolonunda 2 değerine sahip satırlar için tabloyu satır satır okuyup eşleşen kayıtları bulmaya çalışacaktır. İlgili kolonda eğer bir index yok ise explain plan da aşağıda da görebileceğiniz gibi “full table access” yöntemi kullanılacaktır.

OPERATIONOPTIONSOBJECT_NAMEPOSITION
SELECT STATEMENT2
..TABLE ACCESSTABLE ACCESS FULLEMPLOYEES1

Eğer employees tablosunun job_id kolonunda bir index olmuş olsaydı tabloyu full okumak zorunda kalmayacak ve explain plan’ı aşağıdaki gibi olacaktı.

OPERATIONOPTIONSOBJECT_NAMEPOSITION
SELECT STATEMENT2
..TABLE ACCESSINDEX RANGE SCANEMPLOYEES1

Şekilde görüldüğü gibi index range scan yöntemi ile tabloya yapılan erişim sorgu maliyetini düşürmektedir. Elinizdeki sql’leri bu doğrultuda inceleyerek gerekli olabilecek indexleri oluşturabilirsiniz.

Son olarak aşağıdaki gibi bir sql’i ele alalım.

select firts_name, last_name from hr.employee where job_id = 2 and first_name = 'Emrah';

Bu sqli çalıştırırken job_id kolonunda index olmasına rağmen sorgu çalıştırıldığında ilgili index kullanılmayabilir. Bu durumda bileşik index oluşturulması gerekir. İlk oluşturulan basit index tipini ifade etmekteydi. Bu durumda bileşik index oluşturmak zorunda kalınabilirdi. Oracle veritabanında basit ve bileşik index aşağıdaki gibi oluşturulabilir.

# basit index
create index [index_name] on [table_name] (column);

# bileşik index
create index [index_name] on [table_name] (column1,column2);

Oracle Restore to the Point

Bu yazıda oracle veritabanında restore point oluşturulması, oluşturulan restore pointe dönülmesini anlatacağım.

Eğer database’nin archive log modu ve flashback özelliği kapalı ise aşağıdaki şekilde bu özelliklerin açılması gerekiyor. Bu işlemlerin yapılabilmesi için db’nin mount modda olması gerekiyor.

SQL> shutdown immediate;
SQL> startup mount;

Database’i archive log moduna almak için:

SQL> alter database archivelog;

Flashback özelliğinin açılabilmesi için öncelikle aşağıdaki iki parametrenin ayarlanması gerekiyor.

SQL> alter system set db_recovery_file_dest_size = 2G;
SQL> alter system set db_recovery_file_dest = 'path...';

Flashback modunda database log dosyaları oluşturmaktadır. Bu log dosyaları değişen dataların eski görünümünü içermektedir. Logların tutulacağı dizin db_recovery_file_dest parametresiyle belirlenir. Ayrıca dikkat edilmesi gereken db_recovery_file_dest_size değeri diskteki free alan ve oluşacak logların boyutuna yetecek şekilde ayarlanması gerektiğidir.

Parametreler ayarlandıktan sonra flashback özelliği aşağıdaki gibi açılabilir.

SQL> alter database flashback on;

Bu işlem sonunda db açılabilir veya restore point oluşturacaksanız şimdilik veritabanını open moda alma adımını geçmeniz gerekmektedir.

SQL> alter database open;

Archive log modu ve flashback özelliğinin açık olup/olmadığı aşağıdaki gibi teyit edilebilir.

SQL> select flashback_on, log_mode from v$database;

FLASHBACK_ON  LOG_MODE
------------  ----------------
YES           ARCHIVELOG

Bu sonucun döndüğünden emin olduktan sonra restore point oluşturulabilir.

Restore Point Oluşturmak

Veritabanı üzerinde restore point aşağıdaki şekilde oluşturulabilir.

SQL> create restore point RESTORE_POINT_NAME guarantee flashback database;

Burada dikkat edilmesi gereken nokta; restore point create edildiği sırada veritabanının mount modda olması gerekmektedir. Aksi tahtirde oracle data tutarlılığı konusunda garanti vermemektedir.

Create edilen restore pointin teyidi v$restore_point viewinden yapılabilir.

SQL> select name,scn,gua,storage_size from v$restore_point;

NAME                SCN   GUA STORAGE_SIZE
------------------- ---- ---- ------------
RESTORE_POINT_NAME   129  YES      5242800

Restore Point’e Dönmek

Oluşturulan restore pointe dönme işlemi aşağıdaki şekilde yapılabilir.

 SQL> flashback database to restore point RESTORE_POINT_NAME;

Bu işlem sonucunda ilgili restore pointe dönüldüğü kontrolünü v$datafile viewindeki CHECKPOINT_TIME kolonunu kontrol ederek öğrenebilirsiniz. Bu alandaki değerin restore pointi oluşturduğunuz zamanı gösteriyor olması gerekiyor.

ASM Disk Grupları Rebalance İşlemleri

Bu yazı da ASM disk gruplarına eklenen/çıkartılan disklerin ardından mutlaka yapılması gereken rebalance işlemini anlatacağım.

Oracle ASM varolan diskler üzerinde tüm datayı elinden geldiğince eşit şekilde paylaştırmaya çalışır. Bu nedenle yeni disk eklenip çıkartıldığında yapılan rebalance işlemi; dataları disk grubu içerisindeki disklere eşit şekilde paylaştırmaya çalışacaktır.

Örneğin elimizde 10 gb boyutunda 4 adet disk olduğunu varsayalım ve bu disk üzerindeki veriler 4 diske de eşit şekilde dağıtılacağından disklerin doluluk oranı yüzdesel olarak aşağıdaki gibi olacaktır.

DATA disk grubu [Toplam boyut: 40 GB, Free alan: 20,8 GB]
/dev/sdb1  => %48 full
/dev/sdc1  => %48 full
/dev/sdd1  => %48 full
/dev/sde1  => %48 full

Disklerden birini çıkartıp rebalance işlemi yapıldığında tahmini doluluk oranı aşağıdaki gibi olacaktır.

DATA disk grubu [Toplam boyut: 30 GB, Free alan: 10,8 GB]
/dev/sdb1  => %64 full
/dev/sdc1  => %64 full
/dev/sdd1  => %64 full
/dev/sde1  => removed

ASM içerisinde varolan diskleri aşağıdaki komutu kullanarak görebilirsiniz.

$ sqlplus / as sysasm
SQL> select group_number g_n, disk_number d_n, name, total_mb, free_mb, path
from v$asm_disk

g_n d_n name     total_mb free_mb path
1   0   DATA_00  10240    4915    /dev/sdb1
1   1   DATA_01  10240    4915    /dev/sdc1
1   2   DATA_02  10240    4915    /dev/sdd1
1   3   DATA_03  10240    4915    /dev/sde1

Varolan disk(ler) aşağıdaki şekilde çıkartılabilir.

$ sqlplus / as sysasm
SQL> alter diskgroup DATA drop disk DATA_03,DATA...;
 Diskgroup altered.

Bu komutun ardından rebalance işlemi başlayacaktır. İşlem tamamlandıktan sonra varolan disk(ler) removed şeklinde işaretlenecektir. Eğer rebalance işlemini istediğiniz hızda başlatmak istiyorsanız drop komutunu aşağıdaki şekilde kullanmanız gerekmektedir.

SQL> alter diskgroup DATA drop disk DATA_03 rebalance power [0-11];
 Diskgroup altered.

0-11 arası vereceğiniz değer rebalance işleminin hızını belirlemektedir. Öğneğin mesai saatleri içerisinde rebalance işlemini 11 ile başlatırsanız veritabanının response süresi artacaktır. Bu değer veritabanının yoğunluk durumuna göre belirlenmelidir. 0 wait anlamına gelmektedir ve rebalance işlemi o anda başlamaz.

Rebalance işlemini başlattıktan sonra hızını değiştirmemiz mümkün. Bu işlemi aşağıdaki şekilde yapabilirsiniz.

SQL> alter diskgroup DATA rebalance power [0-11];

Rebalance işleminin hangi aşamada olduğu kontrolünü aşağıdaki komutu kullanarak öğrenebilirsiniz.

SQL> select group_number, operation, state, est_minutes
from v$asm_operation;
GROUP_NUMBER OPERA STAT EST_MINUTES
------------ ----- ---- -----------
 1            REBAL RUN  2
 1            REBAL WAIT 0

Varolan disk grubuna yeni disk ekleme işlemi aşağıdaki şekilde yapılabilir.

SQL> alter diskgroup DATA add disk '/dev/sdx1' rebalance power [0-11];

Disk grubuna eklenecek diskin candidate olarak görünmesi gerekmektedir.

Power değeri verilmediği durumlarda bu değer ASM’in asm_power_limit parametresine göre belirlenecektir.

SQL> show parameter limit

NAME                TYPE        VALUE
------------------- ----------- ------
asm_power_limit     integer     1

Oracleasmlib Kurulum ve Konfigürasyon

Oracleasmlib kütüphanesi ile ASM de kullanacağınız data grupları oluşturup oluşturduğunuz gruplara disk ekleyip çıkartma işlemi yapabilirsiniz.

İlk adım olarak oracle ASM kütüphanelerini aşağıdaki gibi kurabilirsiniz.

# yum install oracleasm-support
# yum install oracleasmlib

Kurulumun tamamlanmasının ardından oracleasm kütüphanesi aşağıdaki şekilde aktif edilmelidir. Aktif edildiği anda /dev dizini oracleasm dizini oluşacaktır.

# oracleasm init
 Creating /dev/oracleasm mount point: /dev/oracleasm
 Loading module "oracleasm": oracleasm
 Configuring "oracleasm" to use device physical block size
 Mounting ASMlib driver filesystem: /dev/oracleasm

Ardından disk grupları configure etmek için aşağıdaki komutu kullanabilirsiniz.

# oracleasm configure

Yeni bir disk grubu oluşturup ASM içerisinde kullanacağınız diskleri bu gruba aşağıdaki şekilde ekleyebilirsiniz.

# oracleasm createdisk DATA /dev/sde1
 Writing disk header: done
 Instantiating disk: done

# oracleasm createdisk RECO /dev/sdf1
 Writing disk header: done
 Instantiating disk: done

Disk gruplarının oluştuğu kontrolünü aşağıdaki şekilde yapabilirsiniz.

# oracleasm listdisks
 DATA
 RECO
# oracleasm querydisk -d DATA
 Disk "DATA" is a valid ASM disk on device [8,17]

Bu adımdan sonra grid infrastructure kurumuna başlayabilirsiniz.

Varolan disk grubuna yeni bir disk eklemek için aşağıdaki komutu kullanabilirsiniz (ASM profile’i set etmeniz gerekmektedir). Disk ekleme işini kurulum tamamlandıktan sonra asmca (Oracle ASM Configuration Assistant) ile de yapabilirsiniz.

$ sqlplus / as sysasm
SQL> ALTER DISKGROUP DATA ADD DISK '[DISK PATH]';

SQL> ALTER DISKGROUP DATA ADD DISK '/dev/sdg1';

Disk ekleme işlemini yaptıktan sonra rebalance işlemi yapılması gerekmektedir. Bu yazıda kurulum anlattığım için disklerin içerisi boş olacaktır. Bu nedenle rebalance işlemine gerek olmayabilir. Fakat disk grubunun içerisi dolu ise rebalance işlemi gereklidir.

Rebalance işlemleri için aşağıdaki yazıyı okuyabilirsiniz.

ASM rebalance işlemleri

Oracle Redo Log Switch Map

Oracle veritabanında redo logların saatlik kaç kez switch olduğu bilgisini aşağıdaki sql komutu kullanarak öğrenebilirsiniz.

set linesize 300 
set pagesize 5000
column 00 format 999 heading "00" 
column 01 format 999 heading "01" 
column 02 format 999 heading "02" 
column 03 format 999 heading "03" 
column 04 format 999 heading "04" 
column 05 format 999 heading "05" 
column 06 format 999 heading "06" 
column 07 format 999 heading "07" 
column 08 format 999 heading "08" 
column 09 format 999 heading "09" 
column 10 format 999 heading "10" 
column 11 format 999 heading "11" 
column 12 format 999 heading "12" 
column 13 format 999 heading "13" 
column 14 format 999 heading "14" 
column 15 format 999 heading "15" 
column 16 format 999 heading "16" 
column 17 format 999 heading "17" 
column 18 format 999 heading "18" 
column 19 format 999 heading "19" 
column 20 format 999 heading "20" 
column 21 format 999 heading "21" 
column 22 format 999 heading "22" 
column 23 format 999 heading "23" 
column 24 format 999 heading "24" 
column "Day" for a5 
column INST_ID for a7 
column DAY_S for a8 
column date_s for a14 
prompt 
prompt Redo Log Switches 
prompt 

select  
CASE INST_ID WHEN 1 THEN date_str END date_s,
to_char(INST_ID) INST_ID, 
CASE INST_ID WHEN 1 THEN "Day" END day_s, 
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"  from  (SELECT trunc (first_time) date_str,  INST_ID, 
to_char (trunc (first_time),'Dy') "Day", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 0, 1)) "00", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 1, 1)) "01", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 2, 1)) "02", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 3, 1)) "03", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 4, 1)) "04", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 5, 1)) "05", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 6, 1)) "06", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 7, 1)) "07", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 8, 1)) "08", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 9, 1)) "09", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 10, 1)) "10", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 11, 1)) "11", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 12, 1)) "12", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 13, 1)) "13", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 14, 1)) "14", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 15, 1)) "15", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 16, 1)) "16", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 17, 1)) "17", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 18, 1)) "18", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 19, 1)) "19", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 20, 1)) "20", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 21, 1)) "21", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 22, 1)) "22", 
sum (decode (to_number (to_char (FIRST_TIME, 'HH24')), 23, 1)) "23" 
from gv$log_history 
where trunc(first_time) > sysdate-30 
group by INST_ID, trunc(first_time)  
order by trunc(first_time) DESC, INST_ID );

Redo logların anlık durumlarını kontrol etmek için aşağıdaki komutu kullanabilirsiniz.

set linesize 2000
set pagesize 2000
col REDOLOG_FILE_NAME for a70 
SELECT 
    a.GROUP#,
    a.THREAD#,
    a.SEQUENCE#,
    a.ARCHIVED,
    a.STATUS,
    (a.BYTES/1024/1024) AS SIZE_MB,
    b.MEMBER    AS REDOLOG_FILE_NAME
FROM v$log a 
JOIN v$logfile b ON a.Group#=b.Group# 
ORDER BY 2, a.GROUP# ASC; 

Zaman içerisinde sql lerin devamını ekleyeceğim.

Oracle Enable/Disable Unified Audit

Merhaba arkadaşlar, bu yazıda oracle veritabanlarında unified auditing özelliğini açmayı göstereceğim. Unified özelliğinin açılması sunucu üzerinde bulunan tüm veritabanlarının kapalı olması gerekmektedir.

Veritabanı üzerinde unified auditin açık olup olmadığı kontrol aşağıdaki gibi yapılabilir.

SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

VALUE
-------
NO

Unified audit özelliği aşağıdaki şekilde açılır.

$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk uniaud_on ioracle

İşlem sonrasında unified audit özelliği açılmış olacaktır.

SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

VALUE
-------
YES

Veritabanı üzerinde bulunan logları aşağıdaki şekilde purge edebilirsiniz.

BEGIN 
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type =>  DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
use_last_arch_timestamp =>  FALSE);
END; 
/ 

OS üzerinde bulunan auditleri aşağıdaki şekilde purge edebilirsiniz

EXEC DBMS_AUDIT_MGMT.DROP_PURGE_JOB('CLEANUP_OS_DB_AUDIT_RECORDS'); 


BEGIN 
DBMS_AUDIT_MGMT.DEINIT_CLEANUP( 
AUDIT_TRAIL_TYPE   => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL); 
END;
/

Son olarak açık olan unified audit aşağıdaki gibi kapatılabilir.

$ cd $ORACLE_HOME/rdbms/lib 
$ make -f ins_rdbms.mk uniaud_off ioracle 
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

VALUE
-------
NO

Veri Bilimi ile Saldırı Tespiti

Bu yazımda sunuculara brute force attack ve sql injection gibi yöntemler ile sızmaya çalışan kullanıcıları tespit etmek için kullandığım yöntemi sizinle paylaşacağım.

Bu yöntem sayesinde sunucu güvenliğini arttırıp aylık olarak bana atanmış bandwidth’ten tasaruf edebiliyorum. En önemlisi ise sunucunun sürekli ataklara cevap vermesini engelleyip gerçek isteklere cevap verme süresini arttırıyorum.

Öncelikle bu saldırıları anlamak için Python ile sunucunun log dosyalarını okuyup veritabanına kaydeden bir script hazırladım. Bu script sayesinde logları istediğim şekilde parse edip anlamlı hale getirebiliyorum.

Veritabanına kaydettiğim logları Metabase uygulamasını kullanarak görselleştiriyorum.

Aşağıdaki görselde sunucuya gelen isteklerin sayısını görebilirsiniz. Bu görsel 15 günlük trafiği göstermektedir.

tüm trafik

Bu görselde tüm trafik gösterilmektedir. Görüldüğü üzere gece 12-01 arasında anormal bir artış görünmektedir. Tabi bu trafiğik normal olabilir. Anormal istekler trafiğin yüksek olduğu saatlerde olacak diye bir şey söz konusu değil. Günün o saatinde trafiği arttıracak reklam verilmiş olabilir. Anormal istekleri çektiğimizde bunu anlayacağız.

Anormal istekleri görüntülediğimizde aşağıdaki gibi bir grafik çıkmaktadır. Bu grafik sunucuya yapılan isteği ve bu isteğin sunucu tarafında bir karşılığı olmadığını göstermektedir.

anormal trafik

Gördüğünüz gibi 20:11 sularında toplamda anormal 700 istek gönderilmiş. Bu iki grafiği birleştirdiğimizde farklı zamanlarda atak yapıldığı sonucuna varabiliriz. (Her renk farklı günü göstermektedir) Atak yapılan zamanları aşağıdaki gibi işaretleye biliriz.

anormal sayılabilecek değerler

Bu da demek oluyor ki saldırı zamanı her gün bir önceki güne göre 1 er saat ileriye atılıyor.

Anormal isteklerli kullanıcı bazında görselleştirdiğimiz zaman aşağıdaki gibi bir grafik çıkmaktadır.

kullanıcı bazında anormal trafik

Gördüğünüz gibi ortalama 4 günde bir farklı iplerden ve 1 er saat öteleyerek sunucuya anormal istekler yapılıyor. Bir ip’yi ele aldığımızda yapılan istekler aşağıdaki gibidir. Bu konudaki çıkarımlarımız tutarlı olmuş oldu 🙂

anormal istekler

Ataklardan korunmak için kullandığım yöntemleri başka bir blog yazımda ele alacağım.

Bu tür analizleri firmalarda yapmaktayım. Eğer sizin de bu tür analizlere ihtiyacınız varsa (kesinlikle vardır 🙂 ) benimle iletişime geçebilirsiniz.

[Resolved]: Uncaught Error: Call to undefined function oci_connect()

Php ile oracle veritabanlarına bağlanmaya balıştığınızda aşağıdaki gibi bir hata alıyorsanız çözümü bu yazıda bulabilirsiniz.

<?php

$dbconn = pg_connect("host=localhost port=5432 dbname=testdb user=testusr password=12345");
Fatal error: Call to undefined function oci_connect() in /var/www/html/index.php on line 3

İlk olarak oracle download sayfasından ihtiyacınız olan client sürümünü indirebilirsiniz. Basic ve sdk paketini mutlaka indirmelisiniz. Diğer paketleri ihtiyacınız doğrultusunda indirebilirsiniz. Ben aşağıdaki tüm paketleri indirdim.

instantclient-basic-linux.x64-19.3.0.0.0dbru.zip
instantclient-sqlplus-linux.x64-19.3.0.0.0dbru.zip
instantclient-tools-linux.x64-19.3.0.0.0dbru.zip
instantclient-sdk-linux.x64-19.3.0.0.0dbru.zip
instantclient-jdbc-linux.x64-19.3.0.0.0dbru.zip
instantclient-odbc-linux.x64-19.3.0.0.0dbru.zip

İndirdiğiniz tüm paketleri /opt/oracle dizini altına çıkartın.

# mkdir /opt/oracle
# unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-sqlplus-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-tools-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-sdk-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-jdbc-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-odbc-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/

# ls /opt/oracle
instantclient_19_3

# mv instantclient_19_3 instantclient

Dizin yapısı yukarıdaki gibi olacaktır.

Eğer httpd kullanıyorsanız aşağıdaki dosyaların en altına ilgili komutları kopyalayın.

# cat /etc/sysconfig/httpd

LD_LIBRARY_PATH=/opt/oracle/instantclient
PATH=/opt/oracle/instantclient:$PATH
ORACLE_HOME=/opt/oracle/instantclient 
# cat /etc/bashrc 

export LD_LIBRARY_PATH=/opt/oracle/instantclient
export PATH=/bin:/opt/oracle/instantclient:$PATH
export ORACLE_HOME=/opt/oracle/instantclien

Bu ayarlamaları yaptıktan sonra oci8 modülü kurulması gerekmektedir. Bu modülü pecl veya remi repository’i tanıtarak yum install şeklinde kurabilirsiniz. pecl ile aşağıdaki şekilde kurabilirsiniz.

# pecl download oci8
# tar -zxf oci8-1.4.10.tgz
# cd oci8-1.4.10

phpize ile paketi kurulum için hazırlamak gerekiyor. phpize kurulu değilse yum install phpize şeklinde kurabilirsiniz.

# phpize
# ./configure -with-oci8=shared,instantclient,/opt/oracle/instantclient

veya

# ./configure -with-oci8=shared,$ORACLE_HOME

Son aşama olarak paket kurulumunu aşağıdaki gibi gerçekleştirebilirsiniz.

# make install

PostgreSQL Hot Backup Script

Bu yazıda postgreSQL’in bash scriptleri ile backup alınmasını paylaşacağım. Bu backup yöntemi sayesinde veritabanınızı kapatmaya gerek kalmadan backup alabiliriniz. Bu işlemi yaparken veritabanınızın archivelog modda olduğu varsayılmaktadır.

Postgresql’in kurulu olduğu dizin yapısı şu şekildedir.

/
postgresql
--10 
----archives
----data 
------base
------pg_wal
------logs
------....
------....
------....
--backup

/postgresql/data dizini postgresql’in base dizinidir. Burdaki dosyaları tar’layıp /postgresql/backup dizinine atacağız. Bunu yapan bash scripti aşağıdadır. Bu scriptin postgres kullanıcısı ile çalıştırılması gerekmektedir.

datetoday=$(date '+%Y-%m-%d')

psql -c "SELECT pg_start_backup('hotbackup start');"

cd /postgres/10/

tar -cf /postgres/backup/PGDBBACKUP_$datetoday.tar data/

psql -c "select pg_stop_backup();"

tar -cf /postgres/backup/PGDBBACKUPARC_$datetoday.tar archives/

find /postgres/backup/ -name '*.tar' -mtime +10 -exec rm {} \;
 
cd ./archives/

for i in $(find . -name "*.backup" -mtime +3); do
   echo "$i"
   walname=$(echo $i | cut -c3-42)
   /usr/pgsql-10/bin/pg_archivecleanup -d /postgres/10/archives "$walname"
done