Quantcast
Channel: ÇözümPark
Viewing all 4130 articles
Browse latest View live

Citrix Zafiyetler İçin İlk Güncellemeleri Yayınladı

$
0
0

Citrix daha önce haberini yaptığımız “ haberde “ Citrix, Citrix Application Delivery Controller (ADC) ve Citrix Gateway ürünlerindeki zafiyetleri kapatmak için ilk güncellemeleri yayınladı.

Zafiyet kodu CVE-2019-19781 ile izlenebilen zafiyetler için ilk güncellemeler gelmeye başladı. Citrix ADC ve Citrix Gateway sürüm 11.1’i (ürün yazılımı güncellemesi Refresh Build 11.1.63.15 ile) ve 12’yi (ürün yazılımı güncellemesi Refresh Build 12.0.63.13) için yamaları yayınladı.

Ayın 24’ünde Citrix ADC ve Citrix Gateway sürüm 10.5 (Refresh Build 10.5.70.x ile), 12.1 (Refresh Build 12.1.55.x), 13 (Refresh Build 13.0.47.x ) ve Citrix SD-WAN WANOP Sürüm 10.2.6 (Citrix ADC Sürüm 11.1.51.615 ile) ve Citrix SD-WAN WANOP Sürüm 11.0.3 (Citrix ADC Sürüm 11.1.51.615) için yama çıkarması bekleniyor.

Güvenlik araştırmacıları zafiyetler için PoC  exploid yayınlarken sistemlerin savunmasız olduğunu açıkladılar.

Güncelleme linklerine buradan ve buradan ulabilirsiniz.

Kaynak

Link

The post Citrix Zafiyetler İçin İlk Güncellemeleri Yayınladı appeared first on ÇözümPark.


SQL Server String Fonksiyonları

$
0
0

Yazılımın her alanında olduğu gibi SQL Server üzerinde de en sık yapılan işlemler string işlemleridir. Bu yazımızda SQL Server içerisinde kullanılan string fonksiyonlarını işliyor olacağız.

ASCII

Parametre olarak aldığı stringin ilk harfinin ASCII karşılığını verir.

SELECT ASCII('ABC') AS A, ASCII('B') AS B,   
ASCII('a') AS a, ASCII('b') AS b,  
ASCII(1) AS [1], ASCII(2) AS [2];

CHAR

ASCII fonksiyonunun tersine parametre olarak aldığı int değerinin karakter karşılığını vermektedir.

SELECT CHAR(65), CHAR(66), CHAR(97), CHAR(98), CHAR(49), CHAR(50)

CHAR fonksiyonu kullanılarak yeni satır, tab, satır başı gibi kontrol karakterleri de insert dilebilir. Örneğin aşağıdaki örnekte kişinin adı ve soyadı araya enter karakteri eklenerek alt alta yazıyor.

DECLARE @N NVARCHAR(40)
SET @N = 'Sait' + CHAR(13) + 'ORHAN'
PRINT @N

CHARINDEX

Verilen iki parametreden ilk verilen değeri ikinci parametre içerisinde arar ve bulduğu ilk indeksi verir. Üçüncü parametre de isteğe bağlı ve verilmesi durumunda verilen indekten sonrası için arar. Aranan değer bulunmaz ise 0 değerini döner.

select CHARINDEX('HAN', 'Sait ORHAN')
select CHARINDEX('HAN', 'Sait ORHAN', 7)

CONCAT 

Parametre olarak aldığı string değerlerini birleştirir.

SELECT CONCAT ( 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

CONCAT_WS

Concat fonksiyonu ile aynı şekilde çalışır ancak fark olarak stringleri birleştirirken araya ilk parametreyi koyar. Örneğin aşağıda yukarıdaki örneği “,” ile birleştiriyor.

SELECT CONCAT_ws (',', 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

LEFT

İki parametre alır. İlk parametre bir string değer alır, ikinci parametre olarak bir int değer alır. Sonuç olarak int değeri kadar harfi stringin solundan döndürür.

SELECT LEFT('SAİT ORHAN', 3), LEFT('SAİT ORHAN', 4), LEFT('SAİT ORHAN', 6), LEFT('SAİT ORHAN', 7)

LEN

Parametre olarak aldığı string değerin uzunluğunu döndürür.

SELECT LEN('SAİT ORHAN')
------------Sonuç
-- 10

LOWER

Parametre olarak aldığı stringin tümünü küçük harfe çevirerek dödürür.

SELECT lower('SAİT ORHAN')
------------Sonuç
-- sait orhan

LTRIM

Parametre olarak aldığı stringin solunda olan bütün boşlukları kaldırır.

SELECT LTRIM('     SAİT ORHAN      ')

PATINDEX

İlk parametrede aldığı paterni ikinci parametrede verilen strin içerisinde arar ve bulduğu ilk indeki döndürür. Bulamazsa 0 döner.

select PATINDEX('%R_A%', 'SAİT ORHAN')
select PATINDEX('%R%', 'SAİT ORHAN')
select PATINDEX('SA%', 'SAİT ORHAN')
select PATINDEX('%AN', 'SAİT ORHAN')

REPLACE

Üç parametre alır. İkinci parametrede verilen string değeri birinci parametrede verilen string içerisinde arar ve üçüncü parametrede verilen değer ile değiştirir. Örneğin aşağıdaki örnekte “sai1orhan1” string değerinde geçen “1”leri “2” olarak değiştiriyor.

SELECT REPLACE('sai1orhan1', '1', '2')
--Sonuç
-- sai2orhan2

REPLICATE

Birinci parametrede verilen string değerini ikinci parametrede verilen sayı kadar tekrar ederek döner.

SELECT REPLICATE('12', 3)
--Sonuç
-- 121212

REVERSE

Verilen string değeri ters çevirir.

SELECT REVERSE('123456789')
--Sonuç
-- 987654321

RIGHT

LEFT fonksiyonu ile aynı çalışır. Farkı metni sağdan alıyor olmasıdır.

RTRIM

LTRIM fonksiyonu ile aynı çalışır. Farkı stringin sağındaki boşlukları siliyor olmasıdır.

SPACE

Parametre olarak aldığı sayı değeri kadar boşluk döndürür.

SELECT 'SAİT' + SPACE(7) + 'ORHAN'
SELECT 'SAİT' + SPACE(16) + 'ORHAN'
SELECT 'SAİT' + SPACE(2) + 'ORHAN'

STRING_AGG

Select sorgusunda birinci parametre olarak kendisine verilen kolon değerini ikinci parametrede verilen karakter ile bölerek gösterir. Aşağıdaki örnekte Code alanını arasına “,” koyarak gösteriyor

SELECT STRING_AGG(Code, ',') from DocsTypes
--Sonuç
-- EN,FR,KA,LS,OR,PL,PR,PS,SE,ST,TL,TS

STRING_SPLIT

Birinci parametrede verilen metni ikinci parametrede verilen karaktere göre ayrıştırır. Geriye value adında kolon barındıran ve satırlarında karaktere göre ayrıştırma sonucunu tutan bir tablo döner.

SELECT * from STRING_SPLIT('Bu metin boşluk karakterine göre ayrıştırılacak', ' ')

SUBSTRING

String içerisinden belli bir bölümü döndürür. Üç parametre alır. İlk parametrede işlem yapılacak string değeri, ikinci parametrede alınacak alt parçanın başladığı index değeri ve son parametre olarak da alınacak alt parçanın uzunluğunu alır.

SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 1, 4)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 5, 10)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 25, 1000)
 
--Sonuç
-- Bu m
-- etin boşlu
-- ine göre ayrıştırılacak

TRIM

LTRIM ve RTRIM ile aynı çalışır. Farkı stringin hem sağ hem solundan boşlukları siliyor olmasıdır.

UPPER

LOWER ile aynı çalışır. Verilen stringin tamamını büyük harfe çevirir.

The post SQL Server String Fonksiyonları appeared first on ÇözümPark.

Oracle Database Tablo Sıkıştırma – Table Shrink

$
0
0

Değerli Dostlar,

Biz veri tabanı yöneticileri olarak veri tabanımız üzerinde en çok efor sarf ettiğimiz konulardan bir tanesi sürekli insert , update yada delete alan tablolarda oluşan boyut problemleridir. Oracle veri tabanı mimarisi gereği bir tabloda oluşan DML işlemlerinde eklenen verilerde tablo sürekli büyür fakat silinen veri olursa tabloyu küçülmez, bunun yerine oluşan fragmantasyondan dolayı ilgili tabloda siz ne kadar veri silsenizde blok kaldığı yerden yazmaya devam edeceği için tablo boyutunun her halukarda büyüyeceğidir.

Oracle tablolarda SQL sorgularındaki cost değeri hesaplamak yada mevcut tabloya full table scan bir sorgu geldiğinde hangi veri bloğuna kadar okuyacağını anlamak için High Water Mark isimli özelliği kullanır. Bir tablo ilk defa oluşturulduğunda HWM otomatik olarak bir başlangıç değeri atar ve her insert işleminde bu değer yükselir.Aşağıdaki örnekte görüldüğü gibi tablo insert almaya devam ettikçe pointer otomatik olarak yükselecek ve tabloda buna bağlı olarak değişimler oluşacaktır. Delete işleminde ise mantık olarak bu pointer noktasının düşmesi gerekirken Oracle mimarisi gereği düşmemektedir.

Bu pointer noktasının aynı yerde kalması öncelikli olarak sistem üzerinde gereksiz I/O yaptıracak ve sorgu performansını kötü bir şekilde etkileyerek aynı zamanda disk üzerinde gereksiz bir alan işgal edilmesini sağlayacaktır. Bir tabloda delete işlemi olmasına rağmen neden boyutun küçülmediği anladığımıza göre yazımıza devam edebiliriz.

Shrink edilecek tablolarda dağılmış olan blokların bir araya getirilmesi ve bu sayede tablo boyutlarının küçültülmesi için bilmemiz gereken bazı önemli durumlar mevcut.

  • Compress özelliği olan bir tablo shrink edilemez. Tablo önce nocompress duruma alınmalı shrink işlemi gerçekleştikten sonra tekrar compress özelliği aktif edilmelidir. Eğer compress özelliği olan bir tabloda shrink yaparsanız ORA-10635: Invalid segment or tablespace type hatası alırsınız.
  • Tabloda row movement özelliğinin enable edilmesi gerekir.
  • Bir tablo shrink edilirken Lock edilir, bundan dolayı tabloda ile ilişkili olan durumlarda wait oluşur.

Shrink için işlemlere başlayabilir.

SQL> alter table TBL_LOKUM enable row movement
Table altered

Tablomuzda row movement özelliğini aktif ettik. Şimdi işlerimizin kolaylaşması için basit bir sorgu ile fragmente olan tabloları bulalım ve listeleyelim.

SELECT DISTINCT owner ownr,
                ‘alter table ‘
                                || owner
                                ||’.’
                                || segment_name
                                || ‘ shrink SPACE CASCADE;’ seg_name, segment_type seg_type, tablespace_name tbs_name, file_id dbf_number FROM dba_extents WHERE (
  (
    block_id + 1
  )
  *
  (
         SELECT value
         FROM   v$parameter
         WHERE  upper (name) = ‘db_block_size’) + bytes
)
> (10000 * 1024 * 1024)
AND
segment_type = 'table'
AND
owner = 'ABUZER'
SELECT DISTINCT owner ownr,
                ‘alter TABLE ‘
                                || owner
                                ||’.’
                                || segment_name
                                || ‘ shrink SPACE CASCADE;’ seg_name, segment_type seg_type, tablespace_name tbs_name, file_id dbf_number FROM dba_extents WHERE (
  (
    block_id + 1
  )
  *
  (
         SELECT value
         FROM   v$parameter
         WHERE  upper (name) = ‘db_block_size’) + bytes
)
> (10000 * 1024 * 1024)
AND
segment_type = 'table'
AND
owner = 'ABUZER'

--Sorgu çıktısı --

OWNR SEG_NAME SEG_TYPE TBS_NAME DBF_NUMBER
Alter table ABUZER.TBL_LOKUM shrink space cascade;

Fragmente olan ve shrink edeceğimiz tablolar listelendi. Şimdi shrink işlemine başlayabiliriz.

SQL> alter table ABUZER.TBL_LOKUM shrink space cascade;
Table altered.

Eğer tablomuzda Compress açık halde ise bu adımları yapmanız gerekir.

SQL> alter table TBL_LOKUM enable row movement;
Table altered

SQL> alter table ABUZER.TBL_LOKUM nocompress;
Table altered.

SQL> alter table ABUZER.TBL_LOKUM shrink space cascade;
Table altered.

SQL> alter table ABUZER.TBL_LOKUM compress;
Table altered.

Bu yazımızda Oracle veri tabanında bulunan tabloların nasıl küçültüleceğini anlattık. Yeni yazılarımızda görüşmek dileğiyle.

The post Oracle Database Tablo Sıkıştırma – Table Shrink appeared first on ÇözümPark.

Webcast – SAP Altyapı Tasarımı – 23 Ocak Perşembe Saat 10:00

$
0
0

Bu web seminerimizde SAP altyapılarının tasarımında dikkat edilmesi gereken hususlar ve iş sürekliliği çözüm önerilerini siz değeri katılımcılarımız ile paylaşacağız. Temel olarak inceleyeceğimiz konu başlıkları aşağıdaki gibidir;

– Kapasite planlaması

– İş sürekliliği ve felaket kurtarma seneryoları

– Şifre, sistem adı ve numaralarının etkin kullanımı

– Sap sistemlerinde yükdağılımının önemi, esnek büyüyebilme

– Entegrasyonlar

Kayıt için aşağıdaki linki kullanabilirsiniz

https://zoom.us/webinar/register/WN_xUjCUouiTbetLidpShVs-w

The post Webcast – SAP Altyapı Tasarımı – 23 Ocak Perşembe Saat 10:00 appeared first on ÇözümPark.

Microsoft Türkiye’ye En Yakın Veri Merkezini Kuruyor!

$
0
0

Microsoft bugün akıllı, güvenilir bulut hizmetlerini yerel bir veri merkezi bölgesi aracılığıyla sunmak için şirketin İsrail’deki ilk bulut bölgesini kurmayı planladığını duyurdu. Bu yatırım, Microsoft küresel bulut altyapısını 21 ülkede 56 bulut bölgesine genişletirken, yeni İsrail bölgesinin 2021’de Microsoft Azure’dan başlayarak Office 365 ile birlikte kullanıma sunulması bekleniyor. Yeni İsrail bölgesi Microsoft’un güvenilir bulut ilkelerine bağlı kalacak ve halihazırda bir milyardan fazla müşteriye ve 20 milyon işletmeye hizmet veren dünyanın en büyük bulut altyapılarından birinin parçası olacak.

Azure, bilgi işlem, ağ iletişimi, veritabanları, analitik ve Nesnelerin İnterneti (IoT) hizmetleri sunan, sürekli genişleyen bir bulut hizmetleri kümesidir. Yeni bir İsrail veri merkezi bölgesine yapılan yatırım, müşterilerin en ileri teknolojileri kullanmasını sağlayacak. İsrail’de veri depolamak için veri ikamet gerekliliklerine uymasını sağlayacaktır. Microsoft’un bulut hizmetleri de Avrupa Birliği’nin Genel Veri Koruma Yönetmeliği (GDPR) ile uyumludur. Sektör lideri uluslararası güvenlik ve gizlilik standartları portföyü için onaylanmıştır. Azure, yerel İsrail ekosisteminin buluttaki en son gelişmeleri ve kuruluşların dijital dönüşümlerini yönlendirmelerine yardımcı olacak. Dünyanın önde gelen bulut tabanlı üretkenlik çözümü olan Office 365, yeni veri merkezi bölgesinden edinilebilecek. Müşterilerin modern çalışma ortamını etkinleştirmelerine ve güvenlik, uyumluluk ve şirket içi hizmetlerini koruyacak. Gerçek zamanlı işbirliği ve bulutla çalışan zeka ile çalışanlarını güçlendirmelerine yardımcı olacak.

Neden İsrail?

Microsoft Avrupa, Orta Doğu ve Afrika Başkanı Michel van der Bel; “EMEA genelindeki müşterilerle konuştuğumda, bulut gücünün rekabet gücü için çok önemli olduğu açıktır. Bölgeye önemli altyapı yatırımları yaptık ve bu duyuru ile İsrail’deki planlanan bölgemiz, Almanya, Norveç, Güney Afrika ve İsviçre de dahil olmak üzere son zamanlarda artan sayıda EMEA pazarına katılacak. Microsoft Azure ve Office 365’i İsrail’deki bir veri merkezi bölgesinden sunmak, altyapı kamu sektörü kurumlarının ve işletmelerinin sahip olması gereken teknoloji yoğunluğu için önemli bir yapı taşı olduğundan, yatırımın ve başlangıç ​​ülkesine katılımımızın önemli bir parçasını oluşturuyor. ” Yeni veri merkezi bölgelerinin kurulması, önemli miktarda kaynak yatırımı gerektirmektedir ve bu duyuru Microsoft’un İsrail pazarına sürekli bağlılığını güçlendirmektedir. Şirket 1989 yılında İsrail’de yerel bir şube açarak yolculuğuna başladı. 1991 yılında Microsoft, ABD dışındaki ilk büyük teknoloji şirketlerinden biri olan İsrail Ar-Ge merkezini kurdu. Ayrıca, 2020 yeni bir Microsoft İsrail kampüsünün başlatılmasıyla yerel pazara bir başka önemli yatırım daha ekleyecek. Microsoft’un İsrail teknoloji ekosistemiyle derin bir ilişkisi var. Bir iş kolu, bir Ar-Ge Merkezi, bir Risk Sermayesi Fonu ve Startups için Microsoft programları yürütüyor.

Kaynak

Link

The post Microsoft Türkiye’ye En Yakın Veri Merkezini Kuruyor! appeared first on ÇözümPark.

Azure Backup Agent 1603 Error –Çözümü

$
0
0

Merhabalar,

Bugün Azure Backup Agent update yaparken alınan 1603 hatası ile ilgili çözüm adımını uygulayacağız.

Bildiğiniz üzere Azure Backup Agent aralıklarla güncelleniyor ancak güncellemeyi alamadığı durumlarda sizlere bir pop-up çıkartarak güncellemeyi manuel olarak yapmanızı istiyor.

Bu sıralar en çok karşılaştığım sorunlardan biri olan 1603 Error kodu ile ilgili aşağıdaki adımları yaparak sorunu giderebilirsiniz.

Güncelleme sırasında aldığımız hata aşağıdaki gibidir.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu hatayı aldıktan sonra agent güncelleme penceresini kapatalım.

Sonrasında “C:\Program Files\Microsoft Azure Recovery Services Agent\Temp” yoluna gidelim ve Temp dosyasının içerisindeki dosyaları silelim.

ekran görüntüsü içeren bir resim

Açıklama otomatik olarak oluşturuldu

Bu dosyada geçici update ve backup schedule bilgilerini tutuyor ve sonrasına siliyor.

Temp içerisindeki dosyaları temizledikten sonra Azure Backup Agent güncellemesini yapabiliyor olacaksınız.

Vakit ayırıp okuduğunuz için teşekkür ederim.

The post Azure Backup Agent 1603 Error – Çözümü appeared first on ÇözümPark.

Microsoft Veri Sızıntısı: 250 Milyon Adet Servis Kaydı İfşa Oldu!

$
0
0

Microsoft, 5-31 Aralık tarihleri arasındaki Müşteri servis kayıtlarının bulunduğu veritabanındaki bir yanlış yapılandırılması sonucu veri sızıntısı olduğunu kabul etti.

Web browser üzerinden erişebilecek seviyeye gelen kayıtlar Bob Diachenko’ya göre, yaklaşık 250 milyon Müşteri Hizmetleri ve Destek kayıtlarından oluşuyor. Veri sızıntısının ise 2005 yılından bu yana oluşan kayıt geçmişi olduğu tahmin ediliyor.

Diachenko Raporlarının içerisinde şu kayıtların ifşa olduğu belirtiliyor.

  • Customer email addresses
  • IP addresses
  • Locations
  • Descriptions of CSS claims and cases
  • Microsoft support agent emails
  • Case numbers, resolutions, and remarks
  • Internal notes marked as “confidential”

The post Microsoft Veri Sızıntısı: 250 Milyon Adet Servis Kaydı İfşa Oldu! appeared first on ÇözümPark.

GDPR 126 Milyon Dolar Ceza Kesti

$
0
0

Hukuk bürosu DLA Piper’a göre , AB’nin Genel Veri Koruma Yönetmeliği’nin yürürlüğe girmesinden bu yana , Avrupa veri koruma yetkilileri 160.900’den fazla veri ihlali raporu aldı.

GDPR’nin 25 Mayıs 2018’de tam olarak yürürlüğe girmesinden bu güne kadar, AB veri koruma yetkilileri gizlilik yönetmeliği kapsamında, hepsi veri ihlallerini içermeyen çok çeşitli ihlaller için 114 milyon € (126 milyon $) para cezası verdi.

DLA Piper, “Fransa, Almanya ve Avusturya sırasıyla 51 milyon € [57 milyon $], 24.5 milyon € [27 milyon $] ve 18 milyon € [20 milyon $] ‘dan biraz fazla olan GDPR cezalarının toplam değeri sıralamasında ilk sırada yer alıyor.” Diyerek şöyle devam etti: “Hollanda, Almanya ve Birleşik Krallık, her biri 40.647, 37.636 ve 22.181 bildirimle düzenleyicilere bildirilen veri ihlali sayısı tablosunda en üst sırada yer aldı.”

Bugüne kadar uygulanan 114 milyon € ‘luk toplam ceza tutarı, GDPR kapsamında verilebilecek potansiyel maksimum para cezalarına kıyasla nispeten düşüktür, bu da işin çok başında olduğumuzu gösteriyor” diyor Ross McKean.

“GDPR, Avrupa genelinde oldukça farklı bir şekilde yorumlanmaktadır. Aynı hukuki metin olmasına rağmen, ilke temelli ve yoruma açık olduğu için, uygulamalarda değişiklik gösterebiliyor ” Bazı denetçiler, bildirimleri diğer denetleyicilerden daha düşük bir seviyede yorumlayabiliyor. İngiltere’de, ayda 1.000’den fazla ihlal bildirim almasına rağmen diğer ülkelerde değişiklik gösterebiliyor. “

Gerçekten de bazı ülkeler nüfuslarına göre nispeten düşük sayıda ihlal bildirilmektedir. “ Kişi başına düşen bildirimlerin 62 milyondan fazla nüfusa sahip olan ve yalnızca 1.886 veri ihlali bildirimi bildiren bir ülke olan İtalya gibi ” diyor.

Bu şunu gösteriyor, GDPR hala emekleme aşamasında ve olgunlaşması zaman alacak gibi duruyor.

Kaynak

Link

The post GDPR 126 Milyon Dolar Ceza Kesti appeared first on ÇözümPark.


SQL Server’da Akıllı Auditing

$
0
0

Merhaba, yazının başlığına bakıp SQL Server’ın standart Audit yapısını anlatacağımı düşünüyorsanız sizi bir sürpriz bekliyor. Doğru audit anlatacağım ama bildiğimiz anlamda standart audit değil. Daha iyisi.

SQL Server’da Data Audit anlamında kullanılan bazı teknolojiler var.

Bunlardan birincisi SQL Server Audit. Temel anlamda bir tablo üzerindeki hareketleri loglamamızı sağlayan ve uluslararası denetleme kuruşlarının da kabul ettiği bir standart. Örneğin tablodan şu şekilde bir kayıt sildiğimizi düşünelim.

DELETE FROM WEB_ITEMS WHERE CODE=’93794′

Sistemimizde SQL Server Audit çalıştırıyorsak şayet, bu işlemi şu şekilde loglayabiliriz.

Resimde görüldüğü gibi tabloda hangi sql cümlesinin, ne zaman ve kim tarafından çalıştırıldığı bilgisini gösterir. Buradaki sorun şudur. Sistem belli konuları kayıt altına almakta belli konuları alamamaktadır.

Aşağıdaki tabloda Audit ile kayıt altına alınabilen işlemler listelenmiştir.

Bir diğer loglama teknolojisi SQL Server Change Data Capture (CDC) işlemidir. Bu konu ile alakalı da inşallah ilerleyen zamanlarda bir makale yazacağım.

Change Data Capture için tablomuza baktığımızda ise durum aşağıdaki gibidir.


Gördüğümüz gibi bu iki teknoloji de bizim taleplerimizi tam olarak karşılamamaktadır.

Bu durumda yapılan silme/değiştirme işlemini kayıt altına almak için trigger kullanmak mantıklıdır.

Trigger’lar bildiğiniz üzere herhangi bir veri maniplüasyonu olduğu zaman (insert, update, delete) otomatik çalışacak yapılardır.

Burada yapılacak işlem şudur.

1-Logların tutulacağı bir Log db oluşturma.

2-Log kaydını tutmak istediğimiz tablo için aynı isimde ve aynı formatta bir tablo oluşturma.

3-Bu tabloda otomatik artan alan var ise log database inde oluşturacağımız tabloda bu alanı otomatik artan yapmama. Çünkü bir ID ye sahip bir kayıt birden fazla update işlemi göreceği için aynı ID li kayıt birden fazla loglanacaktır.

4-Oluşturduğumuz tablo için LOG_DATE, LOG_USERNAME,LOG_HOSTNAME, LOG_ PROGRAMNAME, LOG_ACTIONTYPE, LOG_SQL, LOG_CHANGEDCOLUMNS  alanlarını ekleme.

5-Kayıt altına almak istediğimiz tablo için bir delete/update trigger’ı oluşturma. Insert trigger neden oluşturmuyoruz? Derseniz, buna gerek yok derim. Çünkü insert edilen bilgi zaten asıl tabloda var. Biz delete ve update ler ile ilgileniyoruz.

6-Bir de içerisinde 200’den fazla kolon içeren tablolar var. Bu tablolarda pratik bir şekilde hangi kolonun değiştiği bilgisini hızlıca görebilmemiz gerekir.

7-Bir çok uygulama geri tarafta çalışırken kullandığı Object Oriented Programming yapıları sebebi ile gereksiz update ler yapabilmektedir. Yani aslında değişen hiçbir şey yokken SQL Server’a aynı değerler ile update gönderebilmektedir. Bu durumda trigger gereksiz yere çalışır ve gereksiz yere log üretir. Bunun da önüne geçecek şekilde trigger yazılmalıdır.

Görüldüğü üzere trigger yazmak zahmetli,riskli ve dikkatli yapılması gereken bir işlemdir. Sadece 1 tablo için burada 7 adım yazdık. Ayrıca trigger’lar transaction’ın bir parçası olduğu için dikkatli yazılmaz ise, trigger’da bir yerlerde bir hata olduğunda yapılan işlem otomatik olarak Rollback yapılır.

Biraz gözünüzü korkuttuktan sonra aşağıdaki tabloyu gösterip tekrar bir motivasyon vereyim.:)

Şimdi sırayla bu işlemleri bir tablo için yapalım. Sonrasında ise yüzlerce tablo işin bu işi otomatik yapacak scripti de paylaşacağım.

Önce CRM isimli bir veritabanı oluşturuyorum.

Bu veritabanının altına CUSTOMERS isimli bir tablo ekliyorum.

CREATE TABLE [dbo].[CUSTOMER](
[ID] [int] IDENTITY(1,1),
	[CUSTOMERNAME] [varchar](100) ,
	[CITY] [varchar](50) ,
	[DISTRICT] [varchar](50) ,
	[BIRTHDATE] [date] ,
	[GENDER] [varchar](10) 
 
	CONSTRAINT [PK_CUSTOMER] PRIMARY KEY NONCLUSTERED 
	(
	[ID] ASC
	) 
)

Sonra da buraya kayıt ekleyelim.


INSERT INTO CUSTOMER (CUSTOMERNAME,CITY,DISTRICT,BIRTHDATE,GENDER)
VALUES('ÖMER ÇOLAKOĞLU','İSTANBUL','FATİH','1980-01-01','E')

Artık elimizde bir veritabanımız, bir tablomuz ve bir de kaydımız var.

Şimdi log veritabanımızı oluşturalım.


Ve Customer tablosu için log tablosu oluşturalım.

USE CRM_LOG
CREATE TABLE [dbo].[CUSTOMER](
	[ID] [int] ,
	[CUSTOMERNAME] [varchar](100),
	[CITY] [varchar](50),
	[DISTRICT] [varchar](50),
	[BIRTHDATE] [date],
	[GENDER] [varchar](10),
	[_LOG_DATE] [datetime] NULL, --LOG TARIHI
	[_LOG_USERNAME] [varchar](500) NULL,--İŞLEMİ YAPAN KULLANICI
	[_LOG_HOSTNAME] [varchar](500) NULL,--İŞLEM YAPILAN BİLGİSAYAR
	[_LOG_ACTIONTYPE] [varchar](10) NULL,--İŞLEM TÜRÜ UPDATE/DELETE
	[_LOG_PROGRAMNAME] [varchar](500) NULL,--İŞLEMİN YAPILDIĞI UYGULAMA
	[_LOG_SQL] [varchar](max) NULL,--İŞLEM YAPILAN SQL CÜMLESİ
	[_LOG_UPDATEDCOLUMNS] [varchar](max) NULL--DEĞİŞİM GÖREN KOLONLAR
	)

Şimdi trigger ımızı yazıyoruz.

Trigger’ın içerisinde elimden geldiğince açıklamaları yorum satırında yazdım.

CREATE TRIGGER TRG_LOG_CUSTOMER ON CUSTOMER 
AFTER UPDATE,DELETE
AS
BEGIN

/*
SQL SERVER DA TRIGGER İÇERİSİNDE DELETED VE INSERTED TABLOLARI OLUŞUR.
DELETE İŞLEMİNDE SİLİNEN KAYITLAR DELETED TABLOSUNDA TUTULUR, INSERTED TABLOSU BOŞTUR.
INSERT İŞLEMİNDE EKLENEN KAYITLAR INSERTED TABLOSUNDA TUTULUR, DELETED İŞLEMİ BOŞTUR
UPDATE İŞLEMİNDE SATIRIN YENİ BİLGİSİ INSERTED TABLOSUNDA, ESKİ BİLGİSİ INSERTED TABLOSUNDA TUTULUR.
BU BİLGİLERE GÖRE İŞLEMİN INSERT MÜ, UPDATE Mİ, YOKSA DELETE Mİ OLDUĞUNU ANLAYABİLİRİZ.
*/
SET NOCOUNT ON;
 
DECLARE @DELETECOUNT AS INT=0
DECLARE @INSERTCOUNT AS INT=0
DECLARE @UNIONCOUNT AS INT=0

DECLARE @LOG_SQL AS VARCHAR(MAX)
DECLARE @LOG_ACTIONTYPE AS VARCHAR(20)
 
SELECT @DELETECOUNT=COUNT(*) FROM DELETED 
SELECT @INSERTCOUNT=COUNT(*) FROM INSERTED

IF @DELETECOUNT=0 AND @INSERTCOUNT>0
	SET @LOG_ACTIONTYPE='I' --INSERT
IF @DELETECOUNT>0 AND @INSERTCOUNT=0
	SET @LOG_ACTIONTYPE='D' --DELETE 
IF @DELETECOUNT>0 AND @INSERTCOUNT>0
	SET @LOG_ACTIONTYPE='U' --UPDATE  

/******************************************************
KULLANICININ SON YAPTIĞI İŞLEMİ YAKALAMAK İÇİN DBCC INPUTBUFFER(@@SPID) KOMUTUNU KULLANIRIZ.
BU KOMUT BİR TABLO DÖNDÜRÜR. BURADA EVENTTYPE,PARAMETERS VE EVENTINFO ALANI GELİR.
EVENTINFO ALANI ÇALIŞTIRILAN SQL CÜMLESİDİR.
BURADA BU BİLGİYİ YAKALAMAK VE DEĞİŞKENE ATAMAK İÇİN TEMP TABLE KULLANIRIZ.
******************************************************/

CREATE TABLE #INPUTBUFFER (EVENTTYPE VARCHAR(100),PARAMETERS INT,EVENTINFO NVARCHAR(MAX))
INSERT INTO #INPUTBUFFER EXEC ('DBCC INPUTBUFFER(@@SPID)')

SELECT @LOG_SQL=EVENTINFO FROM #INPUTBUFFER

/******************************************************
DİĞER LOGLAMAK İSTEDİĞİMİZ BİLGİLER ZATEN FONKSİYON İLE YAKALANABİLİR.
"PROGRAME_NAME()" FONKSİYONU SQL SERVER'A HANGİ UYGULAMA İLE BAĞLANILDIĞINI GÖSTERİR.
CONNECTION STRING İÇERİSİNDE APPLICATION_NAME ALANINDA YAZAN ATTRIBUTE LERİ BURADAN YAKALARIZ.
BURADA WEB ÜZERİNDEN GELEN KULLANICILAR İÇİN KULLANICI IP'Sİ GİBİ BAŞKA BİLGİLER DE EKLENİP
GÖNDERİLİRSE BUNLAR DA KAYIT ALTINA ALINABİLİR.
******************************************************/

/******************************************************
SUSER_NAME() SQL'E BAĞLANAN KULLANICI ADI
HOST_NAME() BAĞLANAN MAKİNENİN ADI
GETDATE() ANLIK TARİH SAAT BİLGİSİ
******************************************************/

/****************************************************
TABLODA UPDATE İŞLEMİ VAR İSE INSERTED TABLOSUNDAKİ KAYITLAR İLE DELETED TABLOSUNDAKİ KAYITLARI
UNION İLE BİRLEŞTİRDİĞİMİZDE ELDE ETTİĞİMİZ KAYIT SAYISININ INSERTED TABLOSUNDAN BÜYÜK OLMASI GEREKİR
BUNU DA BİR DEĞİŞKENE ATACAĞIZ, UPDATE KONTROLÜNDE  LAZIM OLACAK
******************************************************/
SELECT @UNIONCOUNT=COUNT(*) FROM
(SELECT * FROM INSERTED 
UNION 
SELECT * FROM DELETED) T



/******************************************************
GERİYE UPDATE EDİLEN KOLONLARI YAKALAMAK KALDI. BU DURUMDA BİR KOLONUN UPDATE EDİLİP EDİLMEDİĞİNİ ANLAMAK
İÇİN YENİ VE ESKİ DEĞERLERİNİN KARŞILAŞTIRILMASI GEREKİYOR.
BUNUN İÇİN DE KOLON KOLON KARŞILAŞTIRMAK GEREKİYOR.
******************************************************/

--UPDATE İŞLEMİ İÇİN LOG TABLOMUZA İNSERT ATIYORUZ.
--BURADA @UNIONCOUNT>@INSERTCOUNT İSE EN AZ BİR KOLON GÜNCELLENMİŞTİR.
--AKABİNDE DEĞİŞEN KOLONLARI BULMAK İÇİN AŞAĞIDAKİ UZUN SQL CÜMLEMİZİ YAZIYORUZ.

IF @LOG_ACTIONTYPE='U' AND @UNIONCOUNT>@INSERTCOUNT
BEGIN  
	INSERT INTO CRM_LOG.DBO.CUSTOMER (
	ID,CUSTOMERNAME,CITY,DISTRICT,BIRTHDATE,GENDER, _LOG_DATE, _LOG_USERNAME, _LOG_HOSTNAME, _LOG_ACTIONTYPE, _LOG_PROGRAMNAME, _LOG_SQL,_LOG_UPDATEDCOLUMNS) 
	SELECT D.ID,D.CUSTOMERNAME,D.CITY,D.DISTRICT,D.BIRTHDATE,D.GENDER
	,GETDATE() AS _LOG_DATE,SUSER_NAME() AS _LOG_USERNAME,HOST_NAME() _LOG_HOSTNAME,@LOG_ACTIONTYPE _LOG_ACTIONTYPE,PROGRAM_NAME() _LOG_PROGRAMNAME,@LOG_SQL _LOG_SQL,CASE WHEN (I.ID<>D.ID) THEN   'ID,' ELSE '' END+CASE WHEN (I.CUSTOMERNAME<>D.CUSTOMERNAME) THEN   'CUSTOMERNAME,' ELSE '' END+CASE WHEN (I.CITY<>D.CITY) THEN   'CITY,' ELSE '' END+CASE WHEN (I.DISTRICT<>D.DISTRICT) THEN   'DISTRICT,' ELSE '' END+CASE WHEN (I.BIRTHDATE<>D.BIRTHDATE) THEN   'BIRTHDATE,' ELSE '' END+CASE WHEN (I.GENDER<>D.GENDER) THEN   'GENDER,' ELSE '' END
FROM DELETED D
LEFT JOIN INSERTED I 
ON I.ID=D.ID
END 


--DELETE İŞLEMİ İÇİN İŞİMİZ DAHA KOLAY. DOĞRUDAN LOG ATIYORUZ.

IF @LOG_ACTIONTYPE='D'  
BEGIN  
 
INSERT INTO CRM_LOG.DBO.CUSTOMER (
ID,CUSTOMERNAME,CITY,DISTRICT,BIRTHDATE,GENDER, _LOG_DATE, _LOG_USERNAME, _LOG_HOSTNAME, _LOG_ACTIONTYPE, _LOG_PROGRAMNAME, _LOG_SQL,_LOG_UPDATEDCOLUMNS) 
SELECT D.ID,D.CUSTOMERNAME,D.CITY,D.DISTRICT,D.BIRTHDATE,D.GENDER
,GETDATE() AS _LOG_DATE,SUSER_NAME() AS _LOG_USERNAME,HOST_NAME() _LOG_HOSTNAME,@LOG_ACTIONTYPE _LOG_ACTIONTYPE,PROGRAM_NAME() _LOG_PROGRAMNAME,@LOG_SQL _LOG_SQL,''
FROM DELETED D
END  
END

Gelin şimdi tablomuzu bir update edelim bakalım ne oluyor?

Şimdi de birden fazla alanı update edelim.

Şimdi aynı değerler ile tekrar update edelim bakalım trigger çalışacak mı?


Görüldüğü gibi değişiklik olmadığı için log atmadı.  

Şimdi içeriye bir kayıt daha ekleyip sonra kaydı silelim.


Son durum bu şekilde.

Şimdi Hakan kaydını silelim.

Görüldüğü gibi kayıt silindi ve log tablosuna silinen değerler atıldı.

Şimdi dilerseniz bir de SQL Injection örneği yapalım.

Örneğin basit bir öneri formu uygulaması ve SQL Injection açığı olmuş olsun.

Bunun için bir tablo oluşturalım.

CREATE TABLE [dbo].[ONERI](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[ISIM] [varchar](100) NULL,
	[ONERI] [varchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Basit bir asp.net uygulaması ile bu  tabloya öneri kaydı yapacağız. Bu arada SQL Injection saldırısı yapacağız ve customer tablosundan kayıt sileceğiz. ASP. Uygulamamızda connection string ile SQL

Server’a bağlanırken Application Name attribute’üne Client’ın ip adresini de ekleyeceğiz.

Öneri toplama formu bu şekilde. Buraya bir SQL Injection saldırısı yapalım.


Gönder tuşuna bastıktan sonra sistem öneri formuna bir satır atarken geri tarafta bizim Customer tablosunun içini uçuruyor.


Görüldüğü gibi trigger’ımız bizim istediğimiz her alanı yakalamış durumda.

Şimdi bu yapının iş gördüğüne kanaat getirdikten sonra gelelim bütün tablolar için bu işi otomatik olarak yapma işine.

Bunun için de iki tane procedure ümüz var. Birincisi Log tablosunu oluşturuyor, ikincisi ise asıl tablonun altına trigger’ı ekliyor.

Şimdi bu procedure’lerimize bakalım. Canlı database üzerinde bu procedure leri create edeceğiz.

İlk procedure ümüz tabloyu oluşturuyor.

CREATE PROC [dbo].[CREATE_LOG_TABLE]
 @TABLENAME AS VARCHAR(1000)  ='CUSTOMER'
AS

DECLARE @DBNAME AS VARCHAR(1000)=''

 
 
DECLARE @SQL AS NVARCHAR(MAX)=''
DECLARE @COLUMNS AS VARCHAR(MAX)=''

DECLARE @COLUMN_NAME AS VARCHAR(200)
DECLARE CRS CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TABLENAME
OPEN CRS
FETCH NEXT FROM CRS INTO @COLUMN_NAME
WHILE @@FETCH_STATUS=0
BEGIN
IF @COLUMN_NAME='LOGICALREF'
	SET @COLUMN_NAME='CONVERT(INT,0) AS LOGICALREF'

SET @COLUMNS=@COLUMNS+@COLUMN_NAME+','	
		
FETCH NEXT FROM CRS INTO @COLUMN_NAME
END
CLOSE CRS
DEALLOCATE CRS 


--SET @COLUMNS=SUBSTRING(@COLUMNS,1,LEN(@COLUMNS)-1)
SET @COLUMNS=@COLUMNS+'CONVERT(DATETIME,NULL) AS _LOG_DATE,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(500),NULL) AS _LOG_USERNAME,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(500),NULL) AS _LOG_HOSTNAME,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(10),NULL) AS _LOG_ACTIONTYPE,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(500),NULL) AS _LOG_PROGRAMNAME,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(MAX),NULL) AS _LOG_SQL,'
SET @COLUMNS=@COLUMNS+'CONVERT(VARCHAR(MAX),NULL) AS _LOG_UPDATEDCOLUMNS'

SELECT @COLUMNS 
SET @SQL='IF NOT EXISTS (SELECT * FROM '+DB_NAME()+'_LOG.DBO.SYSOBJECTS WHERE XTYPE=''U'' AND NAME='''+@TABLENAME+''') SELECT TOP 0 '+@COLUMNS+' INTO '+DB_NAME()+'_LOG.DBO.'+@TABLENAME+' FROM '+@DBNAME+'.DBO.'+@TABLENAME 
 SELECT @SQL 
 EXEC SP_EXECUTESQL @SQL 

Şimdi mevcut log tablomuzu silip bu procedure ile otomatik yeniden oluşturacağım.


Tablomuz artık gitti görüldüğü gibi.


Şimdi yenisini oluşturalım.


Şimdi sırada trigger’ı oluşturmak var. Onun için de aşağıdaki procedure’ü kullanacağız.

USE [CRM]
GO
/****** Object:  StoredProcedure [dbo].[CREATE_LOG_TRIGGER]    Script Date: 23.1.2020 17:30:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[CREATE_LOG_TRIGGER] 
@TABLENAME AS VARCHAR(200)='CUSTOMER'
AS
DECLARE @SQL AS NVARCHAR(MAX)
 
SET @SQL='IF EXISTS (SELECT * FROM sys.triggers where NAME=''TRG_'+@TABLENAME+'_LOG'')  DROP TRIGGER  TRG_'+@TABLENAME+'_LOG
' 
EXEC SP_EXECUTESQL @SQL 

DECLARE @PRIMARYKEYCOLUMN AS VARCHAR(255)
SELECT 
    @PRIMARYKEYCOLUMN=COLUMN_NAME
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
        ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE 
    tc.TABLE_NAME = @TABLENAME AND 
    tc.CONSTRAINT_TYPE = 'PRIMARY KEY'

SET @SQL='CREATE TRIGGER TRG_'+@TABLENAME+'_LOG ON '+@TABLENAME
SET @SQL=@SQL+'
AFTER UPDATE,DELETE'
SET @SQL=@SQL+'
AS'
SET @SQL=@SQL+'
BEGIN'
SET @SQL=@SQL+'
DECLARE @LOG_SQL AS VARCHAR(MAX)
DECLARE @LOG_ACTIONTYPE AS VARCHAR(20)
 
SET NOCOUNT ON;
DECLARE @INSERTCOUNT AS INT=0
DECLARE @DELETECOUNT AS INT=0
DECLARE @UNIONCOUNT AS INT=0

SELECT @INSERTCOUNT=COUNT(*) FROM INSERTED 
SELECT @DELETECOUNT=COUNT(*) FROM DELETED 
SELECT @UNIONCOUNT=COUNT(*) FROM
(SELECT * FROM INSERTED 
UNION 
SELECT * FROM DELETED) T'
SET @SQL=@SQL+'
IF @INSERTCOUNT>0 AND @DELETECOUNT>0
	SET @LOG_ACTIONTYPE=''U''
IF @INSERTCOUNT=0 AND @DELETECOUNT>0
	SET @LOG_ACTIONTYPE=''D''
IF @INSERTCOUNT>0 AND @DELETECOUNT=0
	SET @LOG_ACTIONTYPE=''I''
'
DECLARE @COLUMNS AS NVARCHAR(MAX)
DECLARE @COLUMNS2 AS NVARCHAR(MAX)
SELECT  @COLUMNS=(
  SELECT  
'D.'+COLUMN_NAME+','
 
  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TABLENAME  FOR XML PATH('')
)
 
  SET @COLUMNS=REPLACE(@COLUMNS,'&lt;','<')
  SET @COLUMNS=REPLACE(@COLUMNS,'&Gt;','>')
  SET @COLUMNS=SUBSTRING(@COLUMNS,1,LEN(@COLUMNS)-1)


 
SELECT  @COLUMNS2=(
  SELECT  
 'CASE WHEN (I.'+COLUMN_NAME+'<>D.'+COLUMN_NAME+') THEN   '''+COLUMN_NAME+','' ELSE '''' END'++'+'   
 
  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TABLENAME
  FOR XML PATH('')
)

  SET @COLUMNS2=REPLACE(@COLUMNS2,'&lt;','<')
  SET @COLUMNS2=REPLACE(@COLUMNS2,'&Gt;','>')
  SET @COLUMNS2=SUBSTRING(@COLUMNS2,1,LEN(@COLUMNS2)-1)
 
SET @SQL=@SQL+ 'CREATE TABLE #INPUTBUFFER (EVENTTYPE VARCHAR(200),PARAMETERS VARCHAR(1000),EVENTINFO VARCHAR(MAX))
INSERT INTO #INPUTBUFFER EXEC(''DBCC INPUTBUFFER(@@SPID)'')
SELECT @LOG_SQL=EVENTINFO FROM #INPUTBUFFER 
DROP TABLE #INPUTBUFFER
'

SET @SQL=@SQL+ '
IF @LOG_ACTIONTYPE=''U'' AND @UNIONCOUNT>@INSERTCOUNT
BEGIN  
DECLARE @LASTREF AS BIGINT
'
SET @SQL=@SQL+ 'INSERT INTO '+DB_NAME()+'_LOG.DBO.'+@TABLENAME+' (
'
SET @SQL=@SQL+REPLACE(@COLUMNS,'D.','')+', _LOG_DATE, _LOG_USERNAME, _LOG_HOSTNAME, _LOG_ACTIONTYPE, _LOG_PROGRAMNAME, _LOG_SQL,_LOG_UPDATEDCOLUMNS) 
'

SET @SQL=@SQL+ 'SELECT '+@COLUMNS

SET @SQL=@SQL+ '
,GETDATE() AS _LOG_DATE,SUSER_NAME() AS _LOG_USERNAME,HOST_NAME() _LOG_HOSTNAME,@LOG_ACTIONTYPE _LOG_ACTIONTYPE,PROGRAM_NAME() _LOG_PROGRAMNAME,@LOG_SQL _LOG_SQL,'+@COLUMNS2

SET @SQL=@SQL+ '
FROM DELETED D
LEFT JOIN INSERTED I 
ON I.'+@PRIMARYKEYCOLUMN+'=D.'+@PRIMARYKEYCOLUMN+'
END 
'

SET @SQL=@SQL+ '
IF @LOG_ACTIONTYPE=''D''  
BEGIN  

'
SET @SQL=@SQL+ 'INSERT INTO '+DB_NAME()+'_LOG.DBO.'+@TABLENAME+' (
'
SET @SQL=@SQL+REPLACE(@COLUMNS,'D.','')+', _LOG_DATE, _LOG_USERNAME, _LOG_HOSTNAME, _LOG_ACTIONTYPE, _LOG_PROGRAMNAME, _LOG_SQL,_LOG_UPDATEDCOLUMNS) 
'
SET @SQL=@SQL+ 'SELECT '+@COLUMNS

SET @SQL=@SQL+ '
,GETDATE() AS _LOG_DATE,SUSER_NAME() AS _LOG_USERNAME,HOST_NAME() _LOG_HOSTNAME,@LOG_ACTIONTYPE _LOG_ACTIONTYPE,PROGRAM_NAME() _LOG_PROGRAMNAME,@LOG_SQL _LOG_SQL,'''''

SET @SQL=@SQL+ '
FROM DELETED D
 
END 
'
--------------------INSERT----------------
SET @SQL=@SQL+ '
IF @LOG_ACTIONTYPE=''I''  
BEGIN  
'
SET @SQL=@SQL+ 'INSERT INTO '+DB_NAME()+'_LOG.DBO.'+@TABLENAME+' (
'
SET @SQL=@SQL+REPLACE(@COLUMNS,'D.','')+', _LOG_DATE, _LOG_USERNAME, _LOG_HOSTNAME, _LOG_ACTIONTYPE, _LOG_PROGRAMNAME, _LOG_SQL,_LOG_UPDATEDCOLUMNS) 
'
SET @SQL=@SQL+ 'SELECT '+@COLUMNS

SET @SQL=@SQL+ '
,GETDATE() AS _LOG_DATE,SUSER_NAME() AS _LOG_USERNAME,HOST_NAME() _LOG_HOSTNAME,@LOG_ACTIONTYPE _LOG_ACTIONTYPE,PROGRAM_NAME() _LOG_PROGRAMNAME,@LOG_SQL _LOG_SQL,'''''

SET @SQL=@SQL+ '
FROM INSERTED D
 
END 
'

SET @SQL=@SQL+'
END
'
SELECT @COLUMNS,@SQL ,@COLUMNS2
 EXEC SP_EXECUTESQL @SQL 
 

Trigger’ı oluşturmak için mevcut trigger’ı siliyoruz.


Şimdi procedure ile yeniden trigger’ı otomatik oluşturuyoruz.


Şimdi de tüm tablolar için bu işlemi nasıl yapacağız ona bakalım. Benim tavsiyem bu işi tüm tablolar için yapmak yerine kritik gördüğünüz tablolar için yapmanız. Zaten o yüzden procedure leri tablo bazında yaptım.

Önemli gördüğünüz tabloların sayısı da bir miktar olabileceğinden bu işi en kolay yapmanın yolu tablo isimlerini excel’e çekerek yapmak.

Bunun için şu sql kodunu kullanabilirsiniz. Tabi burada ilk önce loglanacak tabloları oluşturuyoruz.

SELECT 
'EXEC CRM.DBO.CREATE_LOG_TABLE '''+NAME+'''' AS SQL_,
NAME AS TABLENAME
 FROM SYSOBJECTS WHERE XTYPE='U' 

Bu sorgudan dönen cevap bu şekildedir.

Dönen sonucu Excel’e alıp içinden istediklerimizi temizleyebiliriz.


Excel’den de management Studio’ya yapıştırabiliriz.


Aşağıdaki işlem ile log tabloları oluşturuldu.


Aynı işlemi şimdi trigger için yapıyoruz.

SELECT 
'EXEC CRM.DBO.CREATE_LOG_TRIGGER '''+NAME+'''' AS SQL_,
NAME AS TABLENAME
 FROM SYSOBJECTS WHERE XTYPE='U' 


Peki sistemimizde iki tablo değil de çok daha fazla tablo olsaydı. Örneğin bir Logo veritabanı olsun.

350 Tablo için log tablolarını otomatik oluşturacağız.



Tablolar oluştu.

Şimdi de trigger’ları oluşturalım.


Aşağıdaki gibi trigger oluştu.


Şimdi bu tabloda bir kayıt update edelim.

Bu da loglanan kaydın bilgisi.

Şimdi de bir kayıt silelim.

Görüldüğü gibi otomatik olarak tüm işimizi gören bir yapı oluşturduk. Burada örnek olsun diye update, delete işlemlerini Management Studio üzerinden yaptım. Başka uygulamalardan da örneğin Logo Tiger’ın kendi içinden yapsak da aynı şekilde yakalayabiliriz.

Uzun bir makale oldu. Buraya kadar geldiyseniz sabırla okuduğunuz  için teşekkür ederim.

Sağlıcakla…

The post SQL Server’da Akıllı Auditing appeared first on ÇözümPark.

Binlerce WordPress Sitesi Hacklendi!

$
0
0

2.000’den fazla WordPress sitesi ziyaretçisi, istenmeyen tarayıcı bildirimi abonelikleri, sahte anketler, reklamlar ve sahte Adobe Flash indirmeleri içeren sahte sitelere yönlendiren saldırıya uğradı.

Bu saldırı, Ocak 2020’nin üçüncü haftasında WordPress eklentilerindeki güvenlik açıklarından yararlanan saldırganları ifşa eden güvenlik firması Sucuri tarafından tespit edildi.

Sucuri araştırmacısı Luke Leak, kötüye kullanılan savunmasız eklentilerin bazılarının “PayPal ile CP İletişim Formu” ve “Basit Alanlar” eklentileri olduğunu söyledi, ancak muhtemelen diğer eklentilerin de hedeflendiğini belirtti.

Bu güvenlik açıklarından yararlanıldığında sistemin, saldırganların admarketlocation [.] Com ve gotosecond2 [.] Com adreslerinden komut dosyalarını içeren JavaScript’i doğrudan sitenin temasına yüklemesine izin verdiği gözlemlendi.

Sucuri, JavaScript’i eklemenin yanı sıra , saldırganların güvenliği ihlal edilen sitelere daha fazla malware yüklemek için kullanılan sahte eklenti dizinleri oluşturduğunu da belirtti.

Sucuri bu olay sonrası WordPress kullanıcılarına bir öneride bulundu. “Bir WordPress sitesi yönetiyorsanız ve güvenliğin ihlal edilmiş olabileceğinden endişeleniyorsanız sitenizi ücretsiz SiteCheck araçları ile tarayabilirsiniz. Bu araçlar ile kötü amaçlı içerikler hakkında bir rapor elde edebilir ve bu rapora göre web sitenizdeki güvenlik açıklarını kapatabilirsiniz.”

Kaynak

Link

The post Binlerce WordPress Sitesi Hacklendi! appeared first on ÇözümPark.

Sürekli Devre Dışı Kalan Outlook Eklentilerini Aktif Etmek

$
0
0

Bu yazımızda Outlook uygulaması üzerine kurulan 3. parti yazılımların sürekli devre dışı kalmasının kalıcı çözümünü anlatıyor olacağız.

Outlook üzerinde aşağıdaki resimdeki gibi hatalar alabilirsiniz:




Bu hatalar sonucunda eklentiniz devre dışı kalır ve Outlook uygulamasını her başlattığınızda tekrar tekrar aktif etmeniz gerekmektedir.

Bu durumunda kurtulmak için kayıt defteri(regedit.exe) üzerinden aşağıdaki değişiklikleri yaparak Outlook eklentinizi sürekli olarak aktif edebilirsiniz.
Bu eklentileri geliştiriciler eklenti yazdıkları esnada aşağıdaki değerleri yazılım üzerinde öncelikli olarak Kayıt Defteri değerini 3. seviyeye çekmektedirler ancak herhangi bir kontrol edilmeyen hata durumunda Outlook bu eklentileri sürekli olarak aktif olmayan eklentiler listesine eklemektedir. Bu durumda ilgili değer Kayıt Defteri üzerinde 0 a çekilmektedir. Aşağıda yapacağımız işlemlerle bu 0 a dönme olayını manuel olarak 3 e çekere sorunu gidereceğiz.

Key: HKEY_CURRENT_USER\Software\Microsoft\Office\x.0\Outlook\Resiliency\DoNotDisableAddinList
DWORD: <ProgID of the add-in>
Value: Hex değerini 1 den A ya kadar yazınız. Bu değer eklentinin neden devre dışı kaldığınız belirtmenize yarar sağlamaktadır.

0x00000001 Boot load (LoadBehavior = 3)
0x00000002 Demand load (LoadBehavior = 9)
0x00000003 Crash
0x00000004 Handling FolderSwitch event
0x00000005 Handling BeforeFolderSwitch event
0x00000006 Item Open
0x00000007 Iteration Count
0x00000008 Shutdown
0x00000009 Crash, but not disabled because add-in is in the allow list
0x0000000A Crash, but not disabled because user selected no in disable dialog.

Yukarıda yazılan x.0 sizin kullandığınız Office sürümünü belirtmektedir. (16.0 = Office 2016, 15.0 = Office 2013).

Yukarıda yapılan işlemin açıklaması şu şekildedir:

  • Key de belirtilen kayıt dizinine gidiniz,
  • İlgili kayıt dizini içerisinde Eklenti adınızı bularak DWORD değerini Crashten kaynaklı olduğunu belirtmek için 3 e çekiniz.
  • Bir sonraki crashlerde eklenti devre dışı kalmayacaktır.

The post Sürekli Devre Dışı Kalan Outlook Eklentilerini Aktif Etmek appeared first on ÇözümPark.

Cisco, Firepower Management Center’daki Zafiyet İçin Güncelleme Yayınladı

$
0
0

Cisco Firepower Management Center ürünündeki zafiyet için güncelleme yayınladı. Firepower Management Center ürün ağ cihazlarını merkezi olarak yönetmeye yarayan bir ürün.

Zafiyet, kimlik doğrulaması yapmadan uzak sisteme erişmesine ve yönetici ayrıcalıkları almasına izin verebiliyor.

Zafiyet CVE-2019-16028 kodu ile izlenebilirken Cisco zafiyet için güncelleme yayınladı. Güncelleme linki

Cisco mühendisi Omar Santos , Cisco müşterilerini zafiyetten etkilenip etkilenmediklerini kontrol etmek için bir kaç öneride bulundu

  • Cisco FMC Yazılımının harici bir LDAP sunucusu aracılığıyla web tabanlı yönetim arabirimi kullanıcılarının kimliğini doğrulamak üzere yapılandırılıp yapılandırılmadığını kontrol edin.
  • Cihazda bir LDAP sunucusu kullanarak harici kimlik doğrulamanın yapılandırılıp yapılandırılmadığını kontrol edin (Sistem> Kullanıcılar> Harici Kimlik Doğrulama)

Kaynak

Link

The post Cisco, Firepower Management Center’daki Zafiyet İçin Güncelleme Yayınladı appeared first on ÇözümPark.

Oracle Otomatik İndex – DBMS_AUTO_INDEX Oracle Database 19c

$
0
0

Değerli Dostlar,

Oracle veri tabanı her yeni sürümle birlikte bizlere hayatı daha da kolaylaştıracak bir takım özellikleri sunmakta. Bu yazımızda öncelikle veri tabanı tarafında daha sonra işletim sisteminde otonom veri tabanı ilkesi hareket eden Oracle’ın biz veri tabanı yöneticilerinin işlerini kolaylaştıracak DBMS_AUTO_INDEX özelliğini tanıtacağız.

Bildiğimiz üzere her veri tabanın da verilere daha hızlı ulaşmak yada performans işlemlerinde index kavramı fazlası ile karşımıza çıkar. Index işlemleri avantajlı olduğu kadar dezavantajlıda olabilir. Doğası gereği index’ler fiziksel disk üzerinde yer kapladığı için hoyratça kullanılmaları durumda gereksiz bir alan kaplamaya ek olarak bizlere fazladan bakım gibi yükler getirebilmektedir.

Peki Oracle Automatic Indexing (DBMS_AUTO_INDEX) özelliği nasıl çalışır ?

  • Öncelikle tablo ve sütünların kullanım durumuna göre aday index olarak tanımlanan ” Candidate Indexes” belirlenir.
  • Güncel istatistikleri olan tablolar index işlemleri için hazırlanır. İstatistik bilgileri eski olan tablolarda otomatik index olmaz.
  • Aday indexler için ( candidate indexes ) SYS_AI ön eki ile invisible indexes oluşturulur. Invisible index oluştuğu için ilk etapta sql deyimlerinde kullanılmaz.
  • Çift taraflı olarak SQL performansları test edilir. Eğer SQL sorguları invisible indexler ile iyileşirse visible indexes durumuna geçilir.Bu sayede otomatik olarak oluşan indexler sql sorgularında kullanılır hale gelir.
  • Invisible olarak oluşan indexler eğer sql sorgularında yeterli performansı sağlamazsa unusable index olarak işaretlenir ve sql sorgusu kara listeye alınır.
  • Unusable olan index daha sonra silinerek kara listeye alınan sql sorgusunun tekrar otomatik index de kullanımı engellenir.

Oracle Automatic Indexing (DBMS_AUTO_INDEX) özelliği nasıl aktif edilir ?

Otomatik index özelliği DBMS_AUTO_INDEX prosedürünün işlenmesi ile kullanılır ve AUTO_INDEX_MODE konfig edilmesinden sonra aktif edilebilir. AUTO_INDEX_MODE aşağıdaki değerleri alabilir.

  • IMPLEMENT : Otomatik index özelliğini aktif eder. Invisible olan indexler, visible index hale gelir. Optimizer tarafından kullanılabilir.
  • REPORT ONLY : Otomatik index açılır fakat aday indexler invisible olarak kalır.
  • OFF : Otomatik index kapatılır.
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','REPORT ONLY');
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');

Otomatik indexler varsayılan olarak tablonun bulunduğu tablespace üzerinde bulunur. Otomatik olarak oluşacak indexler için farklı bir tablespace eklemek belirlemek isterseniz.

CREATE TABLESPACE AUTO_INDEXES_TS DATAFILE SIZE 1024M AUTOEXTEND ON NEXT 200M;

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE','AUTO_INDEXES_TS');

Tekrar default ayara döndürmek için;

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_DEFAULT_TABLESPACE',NULL);

Oracle Otomatik index özelliği aktif edildiği zaman standart olarak bütün şemaları dahil eder. AUTO_INDEX_SCHEMA özelliğini kullanarak eklenecek yada çıkartılacak şemaları TRUE paremetresi ile belirleyebilirsiniz.

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'KADAYIF', allow => TRUE);

Otomatik index bilgilerini görmek için

/* Auto İndex Script B.PARLAYAN */
  SELECT con_id, parameter_name, parameter_value
    FROM cdb_auto_index_config
ORDER BY 1, 2;

Script Çıktısı

0	AUTO_INDEX_COMPRESSION	OFF
0	AUTO_INDEX_DEFAULT_TABLESPACE	
0	AUTO_INDEX_MODE	OFF
0	AUTO_INDEX_REPORT_RETENTION	31
0	AUTO_INDEX_RETENTION_FOR_AUTO	373
0	AUTO_INDEX_RETENTION_FOR_MANUAL	
0	AUTO_INDEX_SCHEMA	
0	AUTO_INDEX_SPACE_BUDGET	50

Otomatik index ile ilgili aktivitileri gözlemlemek isterseniz aşağıdaki sorgudan yararlanabilirsiniz.

SELECT DBMS_AUTO_INDEX.report_activity() FROM dual;

GENERAL INFORMATION
-------------------------------------------------------------------------------
 Activity start               : 23-JAN-2020 02:44:55
 Activity end                 : 23-JAN-2020 02:44:55
 Executions completed         : 0
 Executions interrupted       : 0
 Executions with fatal error  : 0
-------------------------------------------------------------------------------

SUMMARY (AUTO INDEXES)
-------------------------------------------------------------------------------
 Index candidates            : 0
 Indexes created             : 0
 Space used                  : 0 B
 Indexes dropped             : 0
 SQL statements verified     : 0
 SQL statements improved     : 0
 SQL plan baselines created  : 0
 Overall improvement factor  : 0x
-------------------------------------------------------------------------------

SUMMARY (MANUAL INDEXES)
-------------------------------------------------------------------------------
 Unused indexes    : 0
 Space used        : 0 B
 Unusable indexes  : 0
-------------------------------------------------------------------------------

ERRORS
---------------------------------------------------------------------------------------------
No errors found.
---------------------------------------------------------------------------------------------

Bir yazımızın daha sonuna geldik. Otomatik index kavramını hakkında daha detaylı bilgi isterseniz benimde yararlandığım aşağıdaki kaynakları inceleyebilirsiniz.

Managing Index
DBMS_AUTO_INDEX

The post Oracle Otomatik İndex – DBMS_AUTO_INDEX Oracle Database 19c appeared first on ÇözümPark.

Microsoft Gelecek Nesiller İçin GitHub'ı Kopyalıyor

$
0
0

Norveç’te bulunan ve olası bir küresel felaket durumunda bitki nesillerini devam ettirmek için kurulan ve içinde her bitkinin tohumunu bulunduran ambarı duyanımız vardır belki. Şimdi Microsoft’ta aynı senaryo için gelecek nesillere açık kaynak olarak geliştirilen projelerin bir kopyasını 1000 yıl dayanacağı söylenen bir depoya kopyalıyor. Açıklamada şuan GitHub’ta bulunan aktif açık kaynak projeler kopyalanacak.

02.02.2020 tarihinde alınacak olan GitHub kopyası Kuzey Kutbunda bulunan bir dağın 250 metre altında bulunan ve uzun zamandır kullanılmayan bir kömür madeninde saklanacak.

Peki bu veriler nasıl saklanacak:

100KB boyutundan büyük bütün aktif projeler ve aktif olmamakla beraber önemli projeler de buraya kopyalanacak. Kopyalanan her bir proje ayrı bir TAR dosyası olarak oluşturulacak ve her bir projenin konumunu ve nasıl kurulacağını açıklayan okunabilir bir kılavuz da oluşturulacak.

The post Microsoft Gelecek Nesiller İçin GitHub'ı Kopyalıyor appeared first on ÇözümPark.

Yazılımda Bağımlılık Üzerine

$
0
0

Merhabalar, 9 yıldır yazılım sektöründen kazandığım tecrübeleri tekrar sektöre kazandırmam gerektirdiğine inanıyorum. Ülkemizde ki ekosisteme bir şeyler kazandırmak ilerlememiz için hepimizin görevi aslında. Bende ilk yazımı paylaşmaktan mutluluk duyuyorum, faydalı olması dileğiyle.

Teknik borç (technical debt) uygulamamız içerinde yer alan gözle görünebilen, bir işi yaparken kullanılan nesne, bileşen, bağımlılık ve bazı desenlerin gereğinden eksik yada fazla kullanılması sonucunda ortaya çıkan bakım maliyetlerinin dışa vurumudur aslında. Bu borç verimsiz çıktıya, motivasyon düşüklüğüne, yeni geliştirmelerin uygulanmasına, bir şeyleri iyileştirmeye ve en önemlisi önceki yazılımcının kulaklarının çınlamasına 🙂 sebep olur. Bu yazıda sizlere teknik borcun belkide en önemli maddelerinden bir olan bağımlılıkların yönetilmesi konusunda bir şeyler anlatmaya çalışacağım.

Yazılım geliştirdikçe karmaşıklaşan nesnelerin, bileşenlerin ve modüllerin bir birilerine olan bağımlılığının (coupling) arttığı bir şeydir. Bir nesnenin bazı iş süreçlerini sürdürmesi için başka bir nesneye olan ihtiyacı bağımlılığı doğrurur. Yazılımda gevşek bağımlılık (losely coupled) sürdürülebilirlik açısından önemlidir. Aksi takdirde sıkı bağlı (thight coupled) yazılımda yeni özellik eklemek, iyileştirme ve bakım çalışmaları çok zahmetli olur ve bir süre sonra bu uygulamayı yeniden yazalım fikiri doğar. Sıkı bağlılığı yüksek uygulamalarda genelde teknik borç fazladır. Çünkü zamanında yapılmayan yeniden düzenleme (refactoring), katlanarak büyümüş ve artık değiştirilemez koda sahip olunmuştur.

1960 yılında coupling ve cohesion Larry Constantine tarafından Structured Design parçası olarak yazılım kalite metrikleri kapsamına alınmıştır. – Wikipedia

İş ihtiyaçlarına yazılım ile çözüm üretirken sürdürülebilirliği (maintainability) göz önünde bulundurmalıyız. Yani günümüzde yazılmış olan bir uygulamanın yıllar sonra bile yeni bir özellik eklerken, var olanları değiştirirken yada bir şeyleri iyileştirirken bile çalışabilirliğinden ödün vermemeli. Evet, bunu yapmak mümkün. Aşağıda belirtilen prensipleri gözeterek yazılan uygulamalarda çok rahat hareket edebilirsiniz. Ayrıca Java dünyasınca çok güzel belgelenmiş şu sayfayı incelemenizi öneririm. Ben bu yazıda Dependency Injection hakkında bilgi vermeye çalışacağım.

Inversion of Control – IoC

Bağımlılıkların tersine çevrilmesi; ihtiyacı olan nesneye ihtiyaç duyduğu hizmeti oluşturmasına izin vermek yerine hizmeti istemciye dışarıdan vermek modelin temel gereksinimidir. Don’t call us, we’ll call you yöntemi ile çalışır. IoC yapabilmek için Factory Pattern, Service Locator Pattern, Dependency Injection, Contextualized Lookup, Template Method Pattern, Strategy Pattern kullanılabilir.

Inversion of Control Faydaları;

  1. Programın modülerliğini arttırmak ve genişletilebilir hale getirmek
  2. Bir modülü tasarlandığı göreve odaklamak
  3. Modülleri diğer sistemlerin yaptıklarını nasıl yaptıklarıyla ilgili varsayımlardan kurtarmak ve bunun yerine sözleşmelere güvenmek
  4. Bir modülü değiştirirken yan etkileri önlemek
  5. Test edilebilirliği arttırmak

Aşağıdaki örnekle en yaygın kullanılan ve bazı framework’ lerin varsayınlan olarak desteklediği Dependency Injection yöntemi aktarmaya çalışacağım.

Dependency Injection; bir nesnenin başka bir nesne tarafından davranışları bilinmeden ve davranışlarından etkilenmeden kullanılabilmesi tekniğidir. Bu örnekte Order sınıfının Complete metodunda müşteriye e-posta atabilmesini gerçekleştirdiği varsaydım.

Dependecy Injection için 3 yöntem;

  1. Constructor Injection
    En çok kullanılan Dependency Injection yöntemidir.

  2. Property Injection
    İhtiyaç duyulan nesnenin değer atanabilir bir property üzerinden kullanılabilmesidir. Dikkat; NullLogger dışarıdan hiçbir değer atanması durumnda çıkabilecek NullReference hatasının önüne geçilmek için yapılmıştır.

  3. Method Injection
    Her metot çağrımında değişen bir bağımlılık varsa bu yöntem faydalı olabilir.

Sonuç olarak,

Yazılım tarihinden bu yana halen ilkel veri tiplerini kullanmamıza rağmen biz geliştiriciler onu karmaşıklaştırıyoruz. Bu karmaşa bağımlılıkları ortaya çıkartır, zamanla geliştirilmeye devam yazılımın bağımlılıklarını iyi yönetmek için bazı yaklaşımlar uygulamalıyız. Bu yazıda uygulama için bağımlılıklardan bahsetmeye çalıştım. Peki ya diğer bağımlılıklar neler ?

Kaynaklar;
https://en.wikipedia.org/wiki/Technical_debt
https://java-design-patterns.com/principles
https://en.wikipedia.org/wiki/Dependency_injection
https://www.martinfowler.com/articles/injection.html
https://www.martinfowler.com/bliki/InversionOfControl.html
https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/architectural-principles

The post Yazılımda Bağımlılık Üzerine appeared first on ÇözümPark.


Windows Server 2012 R2’den Windows Server 2019’a Yerinde Yükseltme (In-Place Upgade)

$
0
0

Merhaba, günümüzde zamanının su gibi akmasına ek olarak sistemle de çık sık versiyonlar alıp yenilenerek karşımıza çıkmakta. Çalıştığımız mimariler içerisinde güvenlik, ek özellikler, ürünün eski versiyonundaki sorunlar gibi bir çok temel nedenden dolayı yapımızdaki donanımsal veya yazılımsal yapıları ara ara yükseltmek zorunda kalıyoruz. Üzerinde karmaşık işlemler barındıran sistemlerde bu gibi yükseltme işlerinden bazen kaçınabiliyoruz, bazen de bu operasyonlar kritiklik içerdiği için kara kara düşünüyoruz. Bu girişten sonra makalemizin konusu olan Windows Server 2012 R2 işletim sistemini Windows Server 2019 işletim sistemine yükseltme işlemini ele alıyor olacağız.

Yerinde yükseltme işlemi bir çok kişi tarafından pek tercih edilen bir durum olmasa da bazı durumlarda bu bizim için operasyon azaltıcı ve işlerimizi kolaylaştırıcı bir özellik olarak bizleri cezbedebiliyor.

Microsoft firması bu gibi yükseltmeler için genelde bir yol haritası yayımlar. Windows Server sistemler için takip edilecek olan yol haritası aşağıdaki gibidir. Görüldüğü gibi Windows Server ailesinde geçişler R2 versiyonlar dahil 2 versiyon yukarı yerinde yükseltmeye izin veriyor.

Makalemizde test amaçlı olarak Windows Server 2019 versiyonuna geçiş yapıyor olacağız. Yerinde yükseltme metodu ile Windows Server 2019’a geçiş yapabilmek adına en az Windows Server 2012 R2 versiyonuna sahip olmamız gerekmekte. Bu versiyondan daha önceki versiyona sahip sistemlerimiz ver ise yükseltme işini yukarıdaki resimde gözüktüğü gibi kademeler halinde yapmak durumundayız.

Bu gibi işlemlerde bazı durumlarda dikkatli olmak zorundayız. Bunları genel olarak aşağıdaki gibi özetlemek mümkün.

  • 32-bit mimariden 64-bit mimariye doğru in-place yükseltme desteklenmez. Yalnızca 64-bit mimariden 64-bit mimariye doğru in-place yükseltme desteklenir.
  • Bir dilden farklı bir dile doğru in-place yükseltme desteklenmez.
  • Server Core ‘dan Server with GUI ‘ye direkt yükseltme desteklenmez. Ancak yükseltme tamamlandıktan sonra Server Core ile Server with GUI arasında geçiş yapmak mümkün.

Kritik rollere sahip sunucularda yerinde yükseltme (Active Directory Sunucu) pek tercih edilmese dahi bu yükseltme işleminin desteklendiğini teknik olarak, yerinde yükseltmeye mani bir durumun olmadığını da bilmemiz gerekir.

Başka bir makalemizde Windows Server 2012 R2 Active Directory Domain yapımızı, Windows Server 2019’a yükselteceğiz ancak biz sistem yöneticilerinin pek tercih ettiği bir durum olmadığından bu işlemi yerinde yükseltme metodundan farklı bir metotla yapıyor olacağız.

Şimdi adımlarımıza başlayalım. Öncelikle sistemimize göz atacak olursak elimizde bir Windows Server 2012 R2 işletim sistemi kurulu sunucumuz var. Yükseltme işlemine geçmeden önce donanım ve yazılımlarımızın yükseltilecek olan sisteme tam uyumlu olup olmadığını mutlaka teyit ediniz.

Sistemimiz üzerinde bazı verilerimiz ve örnek olarak çalışan bazı rollerimiz mevcut.

Sunucumuzun üzerindeki İşletim Sistemi, Makine İsmi ve lisans durumu aşağıdaki gibi.

Yükseltme işlemi için gerekli olan kaynağımızı sisteme bağlayalım. Ben iso olarak indirip DVD olarak yapıma mount ettim.

Yükleme medyamın içinde yer alan Setup dosyamı çalıştırıyorum.

Kurulum öncesinde gerekli olan güncellemeler var ise bunları internet üzerinden alıp devreye alması için “Download updates, drivers and optional features (recommended)” seçeneğini seçip Next ile ilerliyorum.

Bu ekranda elimizdeki lisans ve geçiş yaptığımız üründen, geçiş yapılacak yükseltme ürünü ile aynı olan versiyonu seçip Next ile ilerliyorum.

Bu ekranımızda lisans sözleşmesini Accept butonuna tıklayarak kabul ediyorum.

Bu ekranımızda yükseltme yapılacak olan işletim sistemimizdeki tüm dosyaların korunması gerektiği seçimini Keep personal files and apps radio butonunu tıklayarak belirleyip Next ile sonraki adıma ilerliyorum.

Yapılan denetim sonrasında dosyalarımızın korunması noktasında bir sorun bulunamadı. Kurulum adımlarına geçiş için Install butonuna tıklıyorum.

Kurulum işlemi başladı. Bu işlemler sırasında sistem birkaç kez otomatik olarak yeniden başlayacak.

Kurulum adımları sorunsuzca tamamlandı. Server 2012 R2 yerine artık Windows Server 2019 karşımızda.

Parolamızı girerek login olalım.

Sistemimiz açıldı dosyalarımız olduğu gibi duruyor.

Windows Server işletim sistemimizin versiyonu değişmiş durumda.

Windows Server 2019 üzerinde makalemizin başında örnek olarak ele aldığımı rol IIS versiyonu güncel ve çalışır durumda.

Eski sisteme ait dosyalarımız gereksiz yer kaplamakta.

Disk temizliği yaparak bu fazla ve yer kaplayan dosyalardan kurtulalım.

Temizlenecek olan tüm sistem dosyalarımızı seçelim.

Sistemimiz tertemiz olarak kullanıma hazır durumda.

Windows Server 2012 R2 sistemini yerinde yükseltme ile Windows Server 2019 versiyonuna geçmiş bulunuyoruz. Yaralı olması dileğiyle bir sonraki makalemizde görüşmek üzere.

The post Windows Server 2012 R2’den Windows Server 2019’a Yerinde Yükseltme (In-Place Upgade) appeared first on ÇözümPark.

Microsoft Teknoloji Zirvesi 2020 İçin Kayıtlar Açıldı

$
0
0

Microsoft Türkiye tarafından bu sene 7. düzenlenecek olan Microsoft Teknoloji Zirvesi, bu yıl 26 Mart 2020 tarihinde İstanbul Haliç Kongre Merkezi’nde düzenlenecek.

Microsoft Türkiye tarafından olan açıklama;

Tarih: 26 Mart 2020, 08:30 – 17:00

Adres: Haliç Kongre Merkezi
Sütlüce Mah. Karaağaç Cad. Haliç Kongre Merkezi Idari Bina No:19 Kat:2, 34445 Beyoğlu / İstanbul / Türkiye

Kayıt Adresi: https://www.microsoftevents.com/profile/form/index.cfm?PKformID=0x9557115abcd&wt.mc_id=AID3006994_QSG_392908

Teknoloji dünyasındaki son yenilikleri iş dünyasının yaratıcı ve vizyoner kurumlarıyla buluşturduğumuz Microsoft Teknoloji Zirvesi’nin 7’ncisini, bu yıl 26 Mart 2020 tarihinde İstanbul Haliç Kongre Merkezi’nde düzenleyeceğiz.

Bilişim dünyasının kalbine dokunan konuları alanında uzman konuşmacılarla birlikte aktaracağımız zirvemizde, bu yıl da teknoloji dünyasının karar verici yöneticilerine ve teknoloji alanında faaliyet gösteren kurumlara zengin bir program sunacağız.

Her sene 2000’i aşkın ziyaretçiyi ağırladığımız zirvede, perakende, finans ve üretim başta olmak üzere, sektörlerin dijital dönüşüm dinamikleri, yeni nesil teknolojiler ve sektörel uygulamalar Türkiye’den ve dünyadan örneklerle aktarılacak. Bu sene de yatırımları ve başarılarıyla Türkiye’nin önde gelen şirketlerine yön veren liderleri bir araya getirdiğimiz CEO paneli katılımcılarla buluşuyor olacak. Ana sahnede demolarla dijital dönüşümün ilham verici örnekleri sunulurken, paralel oturumlarda sektörel sunumların yanı sıra akıllı iş uygulamaları, siber güvenlik, modern iş yeri, altyapı ve uygulamalar, veri ve yapay zeka gibi teknolojiler uzmanların gözünden aktarılacak. Etkinlik alanındaki deneyim ve stand alanlarında ise, katılımcılara bu teknolojileri yerinde deneyimleme fırsatı sunulurken, iş ortaklarımız ve ziyaretçilerimizin daha güçlü iş bağlantıları geliştirmesine olanacak sağlanacak.

Türkiye’deki büyük ve orta ölçekli firmaların üst düzey yöneticilerinin, karar vericilerinin, bilişim sektörünün öncü kuruluşlarının, start-up’ların ve bilgi teknolojileri profesyonellerinin bir araya geleceği Microsoft Teknoloji Zirvesi‘nde sizi de aramızda görmek isteriz.

Ajandalarınıza 26 Mart 2020 Perşembe gününü şimdiden kaydedin!

Saygılarımızla,
Microsoft Türkiye

The post Microsoft Teknoloji Zirvesi 2020 İçin Kayıtlar Açıldı appeared first on ÇözümPark.

FortiSIEM’de Hardcoded SSH Anahtarı

$
0
0

Araştırmacılar FortiSIEM üzeridenki “ tunneluser “ kullanıcıları için tanımlanan ssh anahtarının tüm cihazlarda sisteme gömülü ( Hardcoded ) ve aynı olduğunu tespit etti.

Bu şu anlama geliyor, eğer saldırgan başka bir cihaz üzerinden bu ssh keyi elde ederse diğer cihazlara erişim yapabilir.

Zafiyeti gidermek için bir çok çözüm sunulmuş

FortiSIEM sürüm 5.2.7 ve üstüne yükseltin

Geçici çözüm (FortiSIEM sürüm 5.2.6 ve altı için):

1. SSH to the Supervisor node as the root user.

2. Remove tunneluser SSH configuration file to disable listening on port 19999:

rm -f /etc/ssh/sshd_config.tunneluser

echo rm -f /etc/ssh/sshd_config.tunneluser >> /etc/init.d/phProvision.sh

3. Then terminate sshd running on TCP Port 19999 as follows:

pkill -f /usr/sbin/sshd -p 19999

4.Additional steps can be performed on Supervisor to remove the keys associated with tunneluser account:

rm -f /opt/phoenix/deployment/id_rsa.pub.tunneluser

rm -f /home/tunneluser/.ssh/authorized_keys

rm -f /opt/phoenix/id_rsa.tunneluser ~admin/.ssh/id_rsa

Customers are also advised to disable “tunneluser” SSH access on port 22 by following the steps below:

1. SSH to the Supervisor node as the root user.

2. Add/edit the following line in sshd_config file:

echo DenyUsers tunneluser >>  /etc/ssh/sshd_config

3. service sshd restart

Kaynak

Link

The post FortiSIEM’de Hardcoded SSH Anahtarı appeared first on ÇözümPark.

Mitsubishi Electric Trend Micro'daki Sıfır Gün Açığı Kullanılarak Hacklendi

$
0
0

Hackerlar, Trend Micro OfficeScan’deki sıfır gün açığından faydalanarak Mitsubishi Electric firmasının sunucularına kötü amaçlı dosyalar yerleştirdi.

Yakın kaynaklardan edinilen bilgilere göre, Çinli bir hacker grubu Mitsubishi Electric’e saldırabilmek için Trend Micro OfficeScan antivirüsündeki sıfır gün açığını kullandılar.

Trend Micro bu güvenlik açığını düzeltti, ancak sıfır gün açığının Mitsubishi Electric firması dışındaki başka saldırılarda kullanılıp kullanılmadığı hakkında bilgi vermedi.

MİTSUBİSHİ ELECTRİC HACKLENDİ

Mitsubishi Electric 20.01.2019 tarihinde web sitesinde yayınladığı basın açıklaması ile geçen yıl saldırıya uğradığını belirtti.

Şirket, 28 Haziran 2019’da sistemlerinde bir saldırı tespit edildiğini, bir ay süren bir araştırma sonucunda bilgisayar korsanlarının yaklaşık 200 MB’lık bir dosya çaldığını ve sistemlerine erişebildiğini keşfettiklerini, ayrıca çalınan belgelerin çalışanlar hakkında bilgiler içerdiğini söyledi.

Mitsubishi’ye göre çalınan belgeler şunları içeriyordu:

  • 1987 kişi için istihdam başvurusu verileri
  • Merkez ofisinden 4566 kişi tarafından doldurulan 2012 yılı çalışan anketi sonuçları
  • 2007-2019 yılları arasında emekli olan 1569 Mitsubishi Electric çalışanı hakkında bilgi
  • Şirkete ait gizli teknik malzemeler, satış malzemeleri ve diğer dosyaları içeren dosyalar

SIFIR GÜN

Japon medyasında yayınlanan raporlara göre, hackleme ilk olarak Çin’de Mitsubishi Electric firmasına bağlı olan bir kuruluşta meydana geldi ve daha sonra şirketin 14 departmanına yayıldı.

Saldırının, Mitsubishi Electric personelinin şirketin sunucularından birinde şüpheli bir dosya bulmasının ardından tespit edildiği iddia edildi. Ancak bunların hiçbiri Japon şirketi tarafından onaylanmadı. Mitsubishi Electric hacklenme olayı ile ilgili tek teknik detay, bilgisayar korsanlarının şirketin kullandığı antivirüs programlarından birindeki güvenlik açığından yararlandığı gerçeğiydi.

Saldırıyı bilen bir kaynağa göre, bilgisayar korsanlarının Trend Micro OfficeScan antivirüsündeki bir dizin geçişi ve isteğe bağlı dosya yükleme güvenlik açığı olan CVE-2019-18187’yi kullandığını söyledi.

Trend Micro, müşterilerini CVE-2019-18187 yamasındaki güvenlik açığının bilgisayar korsanları tarafından aktif bir şekilde kullanıldığını belirterek uyardı.

Japon medyası, saldırının Çin devlet destekli bir siber casusluk grubu olan Tick tarafından yapıldığını iddia etti. Tick grubunun, son birkaç yıl içinde tüm dünyadaki çok sayıda hedefi hackleme kampanyası yürüttüğü biliniyor. Grubun OfficeScan sıfır gün açığını diğer hedeflere karşı da kullanıp kullanmadığı belirsizliğini korurken. Trend Micro bu iddialar için yorum yapmayı reddediyor.

Kaynak

Link

The post Mitsubishi Electric Trend Micro'daki Sıfır Gün Açığı Kullanılarak Hacklendi appeared first on ÇözümPark.

Ahtapot SIEM 2.0 sürümü olarak güncellendi

$
0
0

ULAKBİM, Tubitak ve Türkiye Cumhuriyeti Sanayi ve Teknoloji Bakanlığı gibi kurumların projede yer aldığı Milli Siber Güvenlik Çözümü Ahtapot’un SIEM Modülü 2.0 olarak güncellendi.

http://depo.ahtapot.org.tr/ISO/ veya https://www.ahtapot.org.tr/indirmeler.html adresinden güncel ISO formatında indirilebilir,

http://docs.ahtapot.org.tr/ Dökümanlar yardımlarıyla kurulumları yapabilirsiiz.

Ahtapot Projesi Nedir?

Ahtapot, Pardus işletim sistemi üzerinde açık kaynak kodlu siber güvenlik bileşenlerinin entegre edildiği, bir merkezden yönetilebilecek, derinlemesine siber güvenlik çözümü oluşturmayı hedefleyen bir projedir.

Bu proje sayesinde:

  • Kamu kurumları ve askeri kurumların siber güvenlik çözümlerine olan ihtiyaçları karşılanabilecektir.
  • Bilgi sistemlerinde birbirine entegre bileşenlerle derinlemesine ve 360 derece güvenlik çözümleri üretilebilecektir.
  • Güvenlik cihazlarında PARDUS milli işletim sistemi dağıtımı kullanılması sağlanacaktır.
  • Açık kaynaklı olmayan ticari ürünler yerine her fonksiyonunun denetlenebileceği açık kaynak çözümlerle daha “güvenilebilir” siber güvenlik önlemleri alınabilecektir.
  • Gerektiğinde milli insan gücü ile destek ve danışmanlık hizmetleri verilebilecektir.
  • Açık kaynak ve açık standartların yaygınlaştırılması kapsamında açık kaynak kodlu siber güvenlik çözümlerinin ticari ürünlerin yerine kullanılabileceği görülecektir.
  • Bir sistemde gösterge niteliğindeki gidişatın sürekli ve otomatik olarak gözlemlenmesi, olağan dışı aktivitelerin farkına varılması, analiz edilmesi ve önlemler üretilmesi mümkün olacaktır.
  • Ağdaki birçok sunucu ve güvenlik bileşeni tarafından üretilen milyonlarca satır günlük kayıtlarının anlamlandırılabilmesi ve ilişkilendirilmesi sağlanacaktır.
  • Merkezi kurulum ve yönetim yoluyla daha az insan gücüyle daha kolay ve sağlam güvenlik önlemleri alınabilecektir.

The post Ahtapot SIEM 2.0 sürümü olarak güncellendi appeared first on ÇözümPark.

Viewing all 4130 articles
Browse latest View live