<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gürkan Biçer</title>
    <description>The latest articles on DEV Community by Gürkan Biçer (@gurkanbicer).</description>
    <link>https://dev.to/gurkanbicer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F583042%2F7c0bc3ee-4d90-4312-81ff-cef52b52f130.jpg</url>
      <title>DEV Community: Gürkan Biçer</title>
      <link>https://dev.to/gurkanbicer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gurkanbicer"/>
    <language>en</language>
    <item>
      <title>Korunuyor musunuz?</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Fri, 24 Mar 2023 12:15:02 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/korunuyor-musunuz-33fd</link>
      <guid>https://dev.to/gurkanbicer/korunuyor-musunuz-33fd</guid>
      <description>&lt;p&gt;Böyle bir başlık ile aklınızda farklı bir çağrışım yaratmadan konunun amacına hızlı bir giriş yapmak istiyorum.&lt;/p&gt;

&lt;p&gt;Sadece web sitenizi veya uygulamanızı bir sunucuya deploy etmek, anahtarları kapının üzerinde bırakmaktan farklı bir eylem değildir. Sunucu üzerinde; gerek servislerde, gerek yazılım dosyalarınızda, gerekse ağ yapılandırmanızla gerekli güvenlik önlemleri almanız günümüzün en temel sunucu yönetimi işlemleri arasında yer almaktadır.&lt;/p&gt;

&lt;p&gt;Hala SSH portunu 22 bırakmak, RDP portunu 3389 bırakmak veya bu servislere IP bazlı kısıtlamamak ya da en azından bir brute-force atak durumunda engelleme yapmamak gibi hataya düşenler var. &lt;/p&gt;

&lt;p&gt;Bu yazı içerisinde sunucu tarafında alınabilecek güvenlik önlemlerinden sadece birini ve bence en önemlisini; HTTP &amp;amp; HTTPS trafiğini korumanın temel adımlarına değineceğim. &lt;/p&gt;

&lt;h2&gt;
  
  
  ModSecurity nedir?
&lt;/h2&gt;

&lt;p&gt;ModSecurity, açık kaynak kodlu bir WAF (web application firewall) yazılımıdır. Apache için üretilmiş olup, nginx, litespeed ve IIS gibi diğer web servisleri için de desteği bulunmaktadır. &lt;/p&gt;

&lt;p&gt;ModSecurity, HTTP trafiğini detaylı bir şekilde dinleyerek, yaşam döngüsü içerisinde gelen istekleri kabul edip etmeyeceğinizi ve istekleri manipüle edebilmeniz bir konfigürasyon sağlar. &lt;/p&gt;

&lt;p&gt;ModSecurity, günümüzde milyonlarca sunucuda bulunuyor. Üzerine yazılan kurallar hemen hemen her konfigürasyona ait sunucuda aynı şekilde çalışıyor. ModSecurity için hazırlanmış, ücretli ve open-source birçok kural seti bulunmaktadır.&lt;/p&gt;

&lt;h2&gt;
  
  
  ModSecurity ile neler yapabiliriz?
&lt;/h2&gt;

&lt;p&gt;Başlıca olarak şunları yapabiliriz;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User-Agent'a göre engelleme,&lt;/li&gt;
&lt;li&gt;IP adresi veya belirli subnete göre engelleme,&lt;/li&gt;
&lt;li&gt;GeoLookup bazlı engelleme,&lt;/li&gt;
&lt;li&gt;Belirli süre içerisinde gelen istek sayısına göre engelleme,&lt;/li&gt;
&lt;li&gt;Referer bilgisine göre engelleme,&lt;/li&gt;
&lt;li&gt;XSS gibi bilinen açıkları engelleme,&lt;/li&gt;
&lt;li&gt;Wordpress gibi bilinen open-source yazılımların veya kendi yazılımlarınızın açıklarını engelleme,&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ModSec ile User-Agent Engelleme
&lt;/h3&gt;

&lt;p&gt;Web sitenize veya uygulamanıza gönderilen istekleri incelediğinizde tanımadığınız veya güvenli bulmadığınız istekleri analiz ederek, aşağıdaki kuralda olduğu gibi engelleme yapabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule HTTP_User-Agent "zgrab" "deny,status:403,log,id:9000001,msg:'Bad Bot'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Engelleme sonrasında isteklere 403 kodu ile yanıt verilmiş olacaktır.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;204.48.26.63 - - [24/Mar/2023:14:14:07 +0300] "GET /ab2g HTTP/1.1" &lt;strong&gt;403&lt;/strong&gt; 1249 "-" "&lt;strong&gt;Mozilla/5.0 zgrab/0.x&lt;/strong&gt;"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eklenen kurallarda HTTP_User-Agent sonrasındaki parametreye girilen değer User-Agent bilgisi içerisinde aranır ve büyük küçük harf duyarlılığı vardır.&lt;/p&gt;

&lt;p&gt;Bilinen tarayıcıların eski versiyonlarını da aşağıdaki gibi kural ekleyerek engellemek istenmeyen trafiği azaltmaya faydalı olacaktır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule HTTP_User-Agent "Firefox/10.0" "deny,status:403,log,id:900002,msg:'Bad Bot'"
SecRule HTTP_User-Agent "Firefox/12.0" "deny,status:403,log,id:900003,msg:'Bad Bot'"
SecRule HTTP_User-Agent "Firefox/13.0" "deny,status:403,log,id:900004,msg:'Bad Bot'"
SecRule HTTP_User-Agent "Firefox/14.0" "deny,status:403,log,id:900005,msg:'Bad Bot'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tarayıcılar günümüzde otomatik olarak güncellendikleri için User-Agent değerleri de güncellenmektedir. Genellikle, eski Firefox, Chrome, Opera ve diğer tarayıcı sürümlerini bot yazılımlar kullanmaktadır.&lt;/p&gt;

&lt;h3&gt;
  
  
  ModSec ile Boş User-Agent Engelleme
&lt;/h3&gt;

&lt;p&gt;Bilinen bütün tarayıcılar mutlaka User-Agent bilgisini iletir. Eğer User-Agent boş olarak istek atılıyorsa, bu zararlı bir botun gönderdiği istek olabilir. Dolayısıyla, bunu engellemekte de fayda var.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule &amp;amp;REQUEST_HEADERS:User-Agent "@eq 0" "deny,status:403,log,id:900006,msg:'Empty User-Agent'"
SecRule REQUEST_HEADERS:User-Agent "^$" "deny,status:403,log,id:900007,msg:'Empty User-Agent'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ModSec ile Sahte Googlebot Engelleme
&lt;/h3&gt;

&lt;p&gt;Google, websitelerini indekslemek için gönderdiği botların IP adreslerini &lt;a href="https://www.gstatic.com/ipranges/goog.json"&gt;burada&lt;/a&gt; JSON formatında güncel olarak paylaşıyor (referans; &lt;a href="https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot?hl=tr"&gt;Googlebot'u ve diğer Google tarayıcılarını doğrulama&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Gelen isteklerin gerçekten Google'a ait olup olmadığını en doğru şekilde kontrol edebilmek için bu listeyi kullanabiliriz. Bu IP adreslerini googlebot-ips.txt isminde bir dosya oluşturup içerisine yazarsak ve bu IP adresleri haricinde Google olarak istek gönderen botları engellersek, sahte botların website içeriğini çalmasına veya load oluşturmasına müsade etmemiş oluruz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kurallar;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule REMOTE_ADDR "@ipMatchFromFile googlebot-ips.txt" "allow,log,id:999998,ctl:ruleRemoveById=999999,msg:'Real Googlebot'"

SecRule HTTP_User-Agent "Google" "deny,status:403,log,id:999999,msg:'Bad Googlebot'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Google IP Adresleri Listesi;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IPv4 ve IPv6 IP adreslerinin listesini bir txt dosyası içerisine aldım. &lt;a href="https://www.grkn.co/repo/googlebot-ips.txt"&gt;https://www.grkn.co/repo/googlebot-ips.txt&lt;/a&gt; adresinden &lt;strong&gt;24 Mart 2023 14:39&lt;/strong&gt; tarihli bu listeye ulaşabilirsiniz. &lt;/p&gt;

&lt;h3&gt;
  
  
  ModSec ile IP Adresine Göre Engelleme
&lt;/h3&gt;

&lt;p&gt;Kendimize bir karaliste oluşturabiliriz. Belirli IP adresleri ve subnetlerden gelen istekleri, sunucu içerisindeki tüm siteler için engelleyebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule REMOTE_ADDR "@ipMatchFromFile blacklist-ips.txt" "deny,status:403,log,id:999997,msg:'Bad Guys'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;blacklist-ips.txt dosyası aşağıdaki formatta olmalı.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.1.0/24
10.0.0.1
127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sadece belirli bir IP adresini engellemek için de kural oluşturabiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SecRule REMOTE_ADDR "@ipMatch 192.168.1.101" "deny,status:403,log,id:999996,msg:'Bad Guy'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak, ModSec üzerinde spesifik bir IP adresini engellemeyi uygun bulmuyorum. &lt;/p&gt;

&lt;p&gt;Bunu bir .htaccess dosyası veya nginx.conf dosyası ile de yapabiliriz. IPTables veya Windows Firewall gibi yazılım üzerinden de engelleyebiliriz. ModSec kural dosyasını tek bir IP adresi için şişirmeyi pek tavsiye etmiyorum. &lt;/p&gt;

&lt;h3&gt;
  
  
  Dipnot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kuralları modsec2.user.conf dosyası içerisine yazmalı ve kural ekleme sonrasında web servisinizi resetlemelisiniz.&lt;/li&gt;
&lt;li&gt;googlebot-ips.txt ve blacklist-ips.txt dosyaları modsec2.user.conf dosyanız ile aynı dizinde olmalıdır. &lt;/li&gt;
&lt;li&gt;Listeye tek IP eklemek için /32 yazarsanız web servisiniz hata verir, o yüzden 192.168.1.101/32 yerine 192.168.1.101 yazmalısınız. &lt;/li&gt;
&lt;li&gt;Bu yazıyı ilerleyen zamanlarda tekrar güncellemeyi planlıyorum.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>modsec</category>
      <category>waf</category>
      <category>server</category>
      <category>security</category>
    </item>
    <item>
      <title>VanillaJS Cookie Yönetimi</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Mon, 13 Mar 2023 14:49:45 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/vanillajs-cookie-yonetimi-5cpo</link>
      <guid>https://dev.to/gurkanbicer/vanillajs-cookie-yonetimi-5cpo</guid>
      <description>&lt;p&gt;Bir cookie.js dosyası oluşturup, içerisine yazıp unutmalık iki fonksiyon.&lt;/p&gt;

&lt;p&gt;Bazı zamanlarda front-end tarafında cookie okuyup, yazmak gerekebiliyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getCookie(name) {
    var cookieArr = document.cookie.split(";");
    for (var i = 0; i &amp;lt; cookieArr.length; i++) {
        var cookiePair = cookieArr[i].split("=");

        if (name == cookiePair[0].trim()) {
            return decodeURIComponent(cookiePair[1]);
        }
    }

    return null;
}

function setCookie(name, value, expiryMin) {
    var cookie = name + "=" + encodeURIComponent(value);

    if (typeof expiryMin === "number") {
        cookie += "; max-age=" + (expiryMin * 60);
        document.cookie = cookie;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cookie okumak için;&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Cookie yoksa &lt;strong&gt;null&lt;/strong&gt; değer döner.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ console.log(getCookie('BenimAdim'))
# Kuki
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cookie tanımlamak için;&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Son parametrede dakika cinsinden ne kadar süre cookie tutmak istediğimizi belirliyoruz.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ setCookie('BenimAdim', 'Kuki', 1440)
$ console.log(getCookie('BenimAdim'))
# Kuki
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>vanillajs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CentOS 7 NodeJS Kurulumu</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Mon, 13 Mar 2023 14:31:25 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/centos-7-nodejs-kurulumu-205n</link>
      <guid>https://dev.to/gurkanbicer/centos-7-nodejs-kurulumu-205n</guid>
      <description>&lt;p&gt;CentOS 7 sunucu üzerinde NodeJS ve npm kurulumu gerçekleştirmek için aşağıdaki yönergeleri izleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NodeJS 16 kurmak için;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NodeJS 18 kurmak için;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_18.x | sudo -E bash -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından aşağıdaki komutu uygulayarak kurulumu tamamlayabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kurulu NodeJS sürümünü görmek ve teyit etmek için;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Çıktı: v16.19.1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kurulu npm sürümünü görmek ve teyit etmek için;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Çıktı: 8.19.3&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PM2 Kurulumu (Bonus)
&lt;/h3&gt;

&lt;p&gt;Aşağıdaki komutu uygulayarak pm2'yi global olarak kurabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install pm2@latest -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PM2, Nodejs projeleri için işlem yöneticisi paketidir. Aşağıya bıraktığım link ile kullanımına dair gerekli bilgileri edinebilirisiniz. Yakında PM2 ile ilgili bir yazı hazırlamayı da planlıyorum.&lt;/p&gt;

&lt;p&gt;Link; &lt;a href="https://pm2.keymetrics.io/docs/usage/quick-start/"&gt;https://pm2.keymetrics.io/docs/usage/quick-start/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>centos</category>
      <category>node</category>
      <category>npm</category>
      <category>pm2</category>
    </item>
    <item>
      <title>CentOS 7 LAMP Kurulumu</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Mon, 13 Mar 2023 13:57:38 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/centos-7-lamp-kurulumu-3kk8</link>
      <guid>https://dev.to/gurkanbicer/centos-7-lamp-kurulumu-3kk8</guid>
      <description>&lt;p&gt;Aşağıdaki yönergeleri izleyerek panelsiz bir web server kurulumu gerçekleştirebilirsiniz;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sunucu Konfigürasyonu&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt;inux (CentOS 7)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt;pache 2.4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M&lt;/strong&gt;ariaDB 10.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P&lt;/strong&gt;HP 8.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ek bileşenler;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certbot&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;PhpMyAdmin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Genel olarak gerekli olan bazı paketlerin kurulumunu yapmak ve sistemi güncellemekle başlayalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install epel-release yum-utils wget curl screen nano zip unzip git iptables iptables-services
yum -y update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NetworkManager&lt;/strong&gt;'i devre dışı bırakalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl stop NetworkManager
systemctl disable NetworkManager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Network konfigürasyon dosyanızın ifcfg-ens192 olduğunu varsayıyorum, eth0 da olabilir, bunu network yapınıza göre düzenlersiniz. Veyahut, dosyanızı nano ile açıp sonuna NM_CONTROLLED=no ekleyebilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "NM_CONTROLLED=no" &amp;gt;&amp;gt; /etc/sysconfig/network-scripts/ifcfg-ens192
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Network&lt;/strong&gt; servisini başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl enable network
systemctl start network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(isteğe bağlı)&lt;/em&gt; &lt;strong&gt;Firewalld&lt;/strong&gt; servisini devre dışı bırakıp, iptables servisini aktif edip, varsayılan kuralları temizleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
iptables -L
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
service iptables save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://dev.to/gurkanbicer/selinux-nasil-kapatilir-1ieh"&gt;SELinux'u kapatalım&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot işlemi uygulayalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Apache
&lt;/h2&gt;

&lt;p&gt;Apache 2.4'ü yükleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install httpd httpd-itk httpd-tools mod_ssl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apache servislerini başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl start httpd
systemctl enable httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PHP
&lt;/h2&gt;

&lt;p&gt;PHP ve FPM'i yüklemek için repo'yu belirleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y --disablerepo="*" --enablerepo="remi-safe" list php[7-9][0-9].x86_64
yum-config-manager --enable remi-php81
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHP, FPM ve kütüphaneleri yükleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install php php-fpm php-cli php-mysqlnd php-common php-devel php-enchant php-gd php-imap php-intl php-json php-mbstring php-odbc php-pdo php-pgsql php-soap php-ldap php-tidy php-xml php-xmlrpc php-opcache php-pecl-mcrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHP-FPM servisini başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl enable php-fpm
systemctl start php-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/var/www/html&lt;/code&gt; dizini altında bir info.php dosyası oluşturup &lt;code&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/code&gt; komutunu bu dosyaya ekleyip, tarayıcınızdan http://&lt;strong&gt;SUNUCUIPADRESI&lt;/strong&gt;/info.php adresine giriş yapın. Eğer hem erişim sağlayıp hem de PHP info bilgisini görebiliyorsanız, PHP ve Apache başarıyla kurulmuş demektir. &lt;/p&gt;

&lt;h2&gt;
  
  
  MariaDB (MySQL)
&lt;/h2&gt;

&lt;p&gt;MariaDB 10.5 için repo dosyasını oluşturalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano /etc/yum.repos.d/MariaDB.repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dosya içerisine aşağıdakileri girip, kaydedelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MariaDB servisini yükleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install mariadb-server mariadb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MariaDB servisini başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl enable mariadb
systemctl start mariadb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MySQL kurulumunu konfigüre edelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İlk kurulumda root şifresi bulunmamaktadır. Direkt olarak Enter'layıp devam ediyoruz. Diğer soruların yanıtları karşılarında &lt;strong&gt;Y&lt;/strong&gt; ve &lt;strong&gt;n&lt;/strong&gt; olarak belirlidir. Bu işlemleri uygulayalım. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;MySQL root şifrenizi bi yere kaydedin ve unutmayın :)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enter current password for root (enter for none): ENTER
Switch to unix_socket authentication [Y/n]: n
Change the root password? [Y/n]: Y
New password: 
Re-enter new password:
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kurulumu Özelleştirelim
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP.ini
&lt;/h3&gt;

&lt;p&gt;Varsayılan php.ini dosyası yolu aşağıdaki gibidir ve nano ile bu dosyayı açıp konfigürasyonu düzenleyebilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano /etc/php.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1GB ram bellek üzeri sunucular için önerilen konfigürasyon;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memory_limit 256M
post_max_size 100M
upload_max_filesize 100M
max_execution_time 300
max_input_time 300
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Htaccess
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; dosyasını nano ile açın. CTRL + W ile &lt;code&gt;&amp;lt;Directory "/var/www/html"&amp;gt;&lt;/code&gt; şeklinde aratın. &lt;/p&gt;

&lt;p&gt;İlgili blok içerisinde &lt;code&gt;AllowOverride None&lt;/code&gt; satırını &lt;code&gt;AllowOverride All&lt;/code&gt; olarak değiştirin. &lt;/p&gt;

&lt;h3&gt;
  
  
  PhpMyAdmin
&lt;/h3&gt;

&lt;p&gt;Aşağıdaki komutları çalıştırarak phpMyAdmin'i varsayılan dizin altına pma dizin ismiyle kurabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /var/www/html
mkdir -p pma
cd pma
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
mv phpMyAdmin-5.2.1-all-languages/* .
rm -rf phpMyAdmin-5.2.1-all-languages* 
mkdir -p tmp
chown -R apache:apache *
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;http://&lt;strong&gt;IPADRESI&lt;/strong&gt;/pma/ şeklinde phpMyAdmin sayfasına ulaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;Ancak, bu URL brute-force ataklara maruz kalabilir. Bu nedenle bu sayfaya ek bir parola koruması eklemek gerekir.&lt;/p&gt;

&lt;p&gt;İlgili dizin içerisinde bir kullanıcı oluşturalım ve şifre belirleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;htpasswd -c .htpasswd admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sonra yine aynı dizine bir .htaccess dosyası oluşturalım ve aşağıdaki konfigürasyonu ekleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/html/pma/.htpasswd
Require valid-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi http://&lt;strong&gt;IPADRESI&lt;/strong&gt;/pma/ şeklinde ulaşmak istediğinizde ekstra bir korumaya sahip olacaktır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Certbot
&lt;/h3&gt;

&lt;p&gt;Let's Encrypt sertifikası kurulumları gerçekleştirmek için certbot paketini kuralım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum -y install certbot python2-certbot-apache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MPM-ITK
&lt;/h3&gt;

&lt;p&gt;Apache'de kullanıcıların isteklerini virtualhost bazlı ayırmak için mpm-itk'yı aktif edelim. Nano ile 00-mpm-itk.conf dosyasını açalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano /etc/httpd/conf.modules.d/00-mpm-itk.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mod_mpm_itk.so dosyasının başındaki # işaretini kaldıralım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LoadModule mpm_itk_module modules/mod_mpm_itk.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından, httpd servisini yeniden başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Composer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Varsayılan PHP-FPM Pool
&lt;/h3&gt;

&lt;p&gt;Aşağıdaki php-fpm konfigürasyonu &lt;code&gt;/var/www/html&lt;/code&gt; dizini içerisindeki PHP dosyalarını ve isteklerini karşılamak için düzenlenmiştir. &lt;code&gt;/etc/php-fpm.d/www.conf&lt;/code&gt; dosyasını açın ve içerisini boşaltıp aşağıdaki konfigürasyonları ekleyin. Dosyayı kaydettikten sonra &lt;strong&gt;php-fpm&lt;/strong&gt; servisini resetleyin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[www]

user = apache
group = apache
listen = /var/run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0666
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_value[session.save_path]    = /var/lib/php/session
php_value[opcache.file_cache]   = /var/lib/php/opcache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Varsayılan VirtualHost
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/etc/httpd/conf.d&lt;/code&gt; dizini altına &lt;strong&gt;00_default.conf&lt;/strong&gt; isminde bir dosya oluşturun ve aşağıdaki konfigürasyonu tanımlayın. Daha sonrasında &lt;code&gt;httpd -t&lt;/code&gt; komutunu uygulayarak konfigürasyonu test edin. Eğer sorun yoksa, &lt;strong&gt;httpd&lt;/strong&gt; servisini yeniden başlatın.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;VirtualHost _default_:80&amp;gt;
    DocumentRoot "/var/www/html"
    DirectoryIndex index.php index.html index.htm

    &amp;lt;Directory "/var/www/html"&amp;gt; 
               # allow from all 
               Order deny,allow 
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /var/www/html 
       &amp;lt;/Directory&amp;gt; 

       ErrorLog /var/log/httpd/error_log 
       LogLevel warn 
       LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""
       CustomLog /var/log/httpd/access_log combined

       SuexecUserGroup apache apache
       AssignUserId apache apache

       &amp;lt;FilesMatch \.php$&amp;gt;
           &amp;lt;If "-f %{REQUEST_FILENAME}"&amp;gt;
           SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://./"
           &amp;lt;/If&amp;gt;
    &amp;lt;/FilesMatch&amp;gt;
&amp;lt;/VirtualHost&amp;gt;

&amp;lt;VirtualHost _default_:443&amp;gt;
       DocumentRoot "/var/www/html"
       DirectoryIndex index.php index.html index.htm

       &amp;lt;Directory "/var/www/html"&amp;gt;
               # allow from all
               Order deny,allow
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes
               Require all granted
               AllowOverride All
               php_admin_value open_basedir /var/www/html
       &amp;lt;/Directory&amp;gt;

       ErrorLog /var/log/httpd/error_log
       LogLevel warn
       LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""
       CustomLog /var/log/httpd/access_ssl_log combined

       SuexecUserGroup apache apache
       AssignUserId apache apache

       &amp;lt;FilesMatch \.php$&amp;gt;
           &amp;lt;If "-f %{REQUEST_FILENAME}"&amp;gt;
                SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://./"
           &amp;lt;/If&amp;gt;
       &amp;lt;/FilesMatch&amp;gt;

       SSLEngine on
       SSLProtocol all -SSLv2 -SSLv3
       SSLCertificateFile /etc/pki/tls/certs/localhost.crt
       SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
       #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
       #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Yeni Site Tanımlama
&lt;/h3&gt;

&lt;p&gt;Öncelikle kullanıcı tanımlayalım ve gerekli klasörleri oluşturup, yetkilerini düzenleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adduser example
sudo -u example mkdir -p /home/example/public
sudo -u example mkdir -p /home/example/tmp
sudo -u example mkdir -p /home/example/session
sudo -u example mkdir -p /home/example/opcache
chmod -R +s /home/example
chmod -R 0755 /home/example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sonra PHP-FPM konfigürasyonu ekleyip, kullanıcıya özel socket oluşturalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /etc/php-fpm.d
nano example.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHP-FPM Konfigürasyonu;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[example]
user = example
group = example
listen = /var/run/php-fpm/example.sock
listen.owner = example
listen.group = example
listen.mode = 0666
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/example-slow.log
env[TMP] = /home/example/tmp
env[TMPDIR] = /home/example/tmp
env[TEMP] = /home/example/tmp
php_value[session.save_path] = /home/example/session
php_value[opcache.file_cache] = /home/example/opcache
php_value[upload_tmp_dir] = /home/example/tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHP-FPM servisini yeniden başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart php-fpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sonra apache virtualhost konfigürasyonu oluşturalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /etc/httpd/conf.d
nano 01_example.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;HTTP Konfigürasyonu;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/home/example/public"
    DirectoryIndex index.php index.html index.htm

    &amp;lt;Directory "/home/example/public"&amp;gt; 
               # allow from all 
               Order deny,allow 
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /home/example
        &amp;lt;/Directory&amp;gt; 

        ErrorLog /var/log/httpd/example.com-error_log 
        LogLevel warn 
        LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""
        CustomLog /var/log/httpd/example.com-access_log combined

        SuexecUserGroup example example 
        AssignUserId example example

        &amp;lt;FilesMatch \.php$&amp;gt;
           &amp;lt;If "-f %{REQUEST_FILENAME}"&amp;gt;
                SetHandler "proxy:unix:/var/run/php-fpm/example.sock|fcgi://./"
       &amp;lt;/If&amp;gt;      
        &amp;lt;/FilesMatch&amp;gt;       
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından httpd servisini yeniden başlatalım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl restart httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dilerseniz &lt;strong&gt;hosts&lt;/strong&gt; dosyanıza IP adresi ve domain ekleyip test edebilirsiniz, dilerseniz de DNS yönlendirmesi gerçekleştirebilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSL Kurulumu
&lt;/h3&gt;

&lt;p&gt;DNS yönlendirmesi gerçekleştirdiyseniz SSL sertifikası da ilgili siteler için ücretsiz Let's Encrypt SSL sertifikası da kurabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;certbot --apache -d example.com -d www.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Otomatik SSL Sertifikası Yenileme
&lt;/h4&gt;

&lt;p&gt;Crontab'ı açıp aşağıdaki cron satırını ekleyerek SSL sertifika yenileme işlemlerini cron servisine bırakabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crontab -e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cron;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* */12 * * * root /usr/bin/certbot renew &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>centos</category>
      <category>lamp</category>
    </item>
    <item>
      <title>.DS_Store Dosyalarını Oluşturmayı Devre Dışı Bırakmak</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Mon, 13 Mar 2023 08:33:29 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/dsstore-dosyalarini-olusturmayi-devre-disi-birakmak-5db4</link>
      <guid>https://dev.to/gurkanbicer/dsstore-dosyalarini-olusturmayi-devre-disi-birakmak-5db4</guid>
      <description>&lt;p&gt;Son derece masum, ancak bir o kadar sinir bozucu bir dosya olan &lt;strong&gt;.DS_Store&lt;/strong&gt; dosyaları; aslında &lt;strong&gt;MacOS&lt;/strong&gt; işletim sisteminde kullanıcının dokunduğu dosyalar ve klasörlerle ilgili &lt;strong&gt;metadata&lt;/strong&gt; tutmakla görevli. Bu veriler dosya isimleri, ikonlar, klasör ayarları vb. bilgilerdir. &lt;/p&gt;

&lt;h3&gt;
  
  
  Nasıl Devre Dışı Bırakılır?
&lt;/h3&gt;

&lt;p&gt;.DS_Store dosyalarının oluşmasını devre dışı bırakmak için, Terminal'i açıp, aşağıdaki komutu uygulamanız yeterlidir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;defaults write com.apple.desktopservices DSDontWriteNetworkStores true&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nasıl Aktif Edilir?
&lt;/h3&gt;

&lt;p&gt;.DS_Store dosyalarının oluşmasını tekrar aktif etmek için, Terminal'i açıp, aşağıdaki komutu uygulamanız yeterlidir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;defaults write com.apple.desktopservices DSDontWriteNetworkStores false&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mevcut .DS_Store Dosyaları Nasıl Silinir?
&lt;/h3&gt;

&lt;p&gt;Terminal'i açın ve kullanıcınınızın home dizininde kalın. Yani &lt;code&gt;pwd&lt;/code&gt; komutu uyguladığınızda &lt;code&gt;/Users/gurkanbicer&lt;/code&gt; gibi kendi klasörünüzde olmalısınız. Aşağıdaki komutu uyguladığınızda tüm alt klasörlerdeki .DS_Store dosyalarını temizleyecektir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find . -name ".DS_Store" -print -delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Geçenlerde bununla ilgili bir olay da oldu. Acilen işlem yapılması gerektiğini söyleyen, zaafiyet içeren IP adreslerinin ve zaafiyet sebeplerinin yer aldığı bir zarf teslim aldım. İlgili devlet kurumu, .DS_Store dosyalarını zaafiyet olarak nitelendirmiş ve internete açık bir şekilde durmaması gerektiğini belirtmiş. Aciliyet sebebini ve ne gibi bir güvenlik sorununa yol açabileceğini henüz anlayamadım ama o da heralde .DS_Store dosyalarından haz etmeyen biri heralde -_- Kağıt, zarf ve zaman kaybından başka bir şey değildi. Neyse ki, dosyaları temizleyip, zaafiyeti giderdim (!)&lt;/p&gt;

&lt;p&gt;Eğer ki bu bir &lt;strong&gt;.git&lt;/strong&gt; klasörü olsaydı ya da herhangi bir kimlik bilgisi içeren klasör olsaydı, &lt;strong&gt;aciliyet sebebi son derece anlaşılabilir olurdu.&lt;/strong&gt; &lt;/p&gt;

</description>
      <category>macos</category>
    </item>
    <item>
      <title>PHP ile Kullanıcının Gerçek IP Adresini Almak</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Mon, 13 Mar 2023 07:55:35 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/php-ile-kullanicinin-gercek-ip-adresini-almak-1a4h</link>
      <guid>https://dev.to/gurkanbicer/php-ile-kullanicinin-gercek-ip-adresini-almak-1a4h</guid>
      <description>&lt;p&gt;Web server eğer &lt;strong&gt;Cloudflare&lt;/strong&gt; veya herhangi bir &lt;strong&gt;Reverse Proxy&lt;/strong&gt; arkasındaysa, kullanıcının gerçek IP adresini almak için ekstra bir fonksiyona ihtiyaç duyarız. Aşağıdaki fonksiyon kullanıcının gerçek IP adresini almak için yardımcı olarak kullanılabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getClientIP()
{
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    } else if (isset($_SERVER['HTTP_X_REAL_IP'])) {
        return $_SERVER['HTTP_X_REAL_IP'];
    } else if (isset($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
        return $_SERVER['HTTP_X_FORWARDED'];
    } else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_FORWARDED'])) {
        return $_SERVER['HTTP_FORWARDED'];
    } else {
        return $_SERVER['REMOTE_ADDR'];
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var_dump(getClientIP());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çıktı;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;string(9) "104.28.154.247"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Çıktıda belirtilen IP adresi neden Cloudflare IP adresi, kod mu hatalı?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hayır. Kod doğru. İnternet bağlantım için kendi IP adresimi, kendi sunucularım ve belli başlı online bankacılık işlemlerim harici isteklerimi Cloudflare WARP üzerinden ücretsiz geçirerek gizliyorum. Bir başka yazıda Cloudflare WARP hakkında bahsedeceğim.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
    </item>
    <item>
      <title>SELinux Nasıl Kapatılır?</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Sun, 12 Mar 2023 20:26:25 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/selinux-nasil-kapatilir-1ieh</link>
      <guid>https://dev.to/gurkanbicer/selinux-nasil-kapatilir-1ieh</guid>
      <description>&lt;p&gt;&lt;strong&gt;SELinux&lt;/strong&gt;, &lt;strong&gt;Linux&lt;/strong&gt; dağıtımlarında ek bir güvenlik protokolü modülüdür.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SELinux&lt;/strong&gt; mevcut olarak üç adet duruma sahiptir;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enforcing&lt;/strong&gt;: İzinsiz bütün erişimler yasaklanır. Bu duruma aktif SELinux da denmektedir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissive&lt;/strong&gt;: SELinux uyarılar verir. İlk durumun aksine bu durumda izinsiz erişim mümkündür ancak uyarı gösterilmektedir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disabled&lt;/strong&gt;: SELinux tamamen devre dışıdır ve uyarısız bütün erişimlere izin verilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bazı durumlarda SELinux'u geçici veya kalıcı olarak kapatma ihtiyacımız olabilmektedir.&lt;/p&gt;

&lt;p&gt;Mevcut durumu görüntülemek için;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sestatus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eğer geçici olarak kapatmak istiyorsak terminal ekranında aşağıdaki komutu uygulamamız yeterlidir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setenforce 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eğer kalıcı olarak kapatmak istiyorsak;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CentOS&lt;/strong&gt; için;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt; için;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/semanage.conf
sed -i "s/SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/semanage.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kısacası dosya yolu değişiyor. Sadece SELINUX parametresine disabled değerini veriyoruz. Metin editörü ile açıp düzenlemek isterseniz siz bilirsiniz, ben &lt;strong&gt;sed&lt;/strong&gt; ile iki saniye terminale komutları yapıştırıp geçiyorum.&lt;/p&gt;

&lt;p&gt;Ha unutmadan, SELinux'u kalıcı olarak kapattıktan sonra Türk usülü bir reboot atıyorum cihaza, varsa sorunlar çözülsün diye :)&lt;/p&gt;

</description>
      <category>linux</category>
      <category>selinux</category>
      <category>centos</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Linux Sunucularda Varsayılan Metin Editörünü Değiştirmek</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Sun, 12 Mar 2023 20:04:41 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/linux-sunucularda-varsayilan-metin-editorunu-degistirmek-5dl0</link>
      <guid>https://dev.to/gurkanbicer/linux-sunucularda-varsayilan-metin-editorunu-degistirmek-5dl0</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Linux&lt;/strong&gt; sunucularda &lt;strong&gt;Nano&lt;/strong&gt; editörü varsayılan olarak nasıl ayarlanır? &lt;strong&gt;Centos&lt;/strong&gt; veya &lt;strong&gt;Ubuntu&lt;/strong&gt; varsayılan &lt;strong&gt;metin editörü&lt;/strong&gt; nasıl değiştirilir?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Emin olun, bu soruları Google'a yazmaktan daha kısa bir şekilde çözmenin yolu var :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Nano Metin Editörünü Varsayılan Olarak Ayarlamak
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Terminali açın ve SSH ile sunucunuza bağlanın.&lt;/li&gt;
&lt;li&gt;Root dizininizde yer alan &lt;code&gt;.bashrc&lt;/code&gt; dosyanızı nano ile açın.&lt;/li&gt;
&lt;li&gt;Aşağıdaki konfigürasyonu dosyanın en sonuna yeni satır olarak ekleyin;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export EDITOR='/usr/bin/nano'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Profil dosyanızı aşağıdaki komut ile yeniden okuyun veya çıkış yapıp tekrar giriş yapın.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;source ~/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eğer ZSH kullanıyorsanız dosyanız &lt;code&gt;.zshrc&lt;/code&gt; olmalı. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vim&lt;/strong&gt; metin editörü fanları gelmeden yazıyı burada sonlandırıyorum.&lt;/p&gt;

&lt;p&gt;-,-&lt;/p&gt;

</description>
      <category>linux</category>
      <category>centos</category>
      <category>ubuntu</category>
      <category>nano</category>
    </item>
    <item>
      <title>Powershell ile RDP Port Değiştirmek</title>
      <dc:creator>Gürkan Biçer</dc:creator>
      <pubDate>Sun, 12 Mar 2023 19:45:28 +0000</pubDate>
      <link>https://dev.to/gurkanbicer/powershell-ile-rdp-port-degistirmek-420d</link>
      <guid>https://dev.to/gurkanbicer/powershell-ile-rdp-port-degistirmek-420d</guid>
      <description>&lt;p&gt;RDP portunu değiştirmek için Regedit yolunu nasıl hatırlayabilirim?&lt;/p&gt;

&lt;p&gt;Eğer benim gibi yüzlerce sunucu kuruyor veya yönetiyorsanız, RDP port değiştirmek için Regedit ve Windows Firewall üzerinden işlem yapmanız acı verici olabilir. Bu nedenle, bir powershell script hazırladım.&lt;/p&gt;

&lt;p&gt;Powershell'i administrator olarak açın. Aşağıdaki komutları kopyalayın ve Powershell ekranına yapıştırın. Bu komutlar, RDP portu değiştirecek ve Windows Firewall için gerekli kuralları ekleyecek.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;portvalue&lt;/code&gt; değişkenine dilediğiniz port numarasını yazabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$portvalue = 3581
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber" -Value $portvalue 
New-NetFirewallRule -DisplayName 'RDPPORT-TCP-In' -Profile 'Any' -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portvalue 
New-NetFirewallRule -DisplayName 'RDPPORT-UDP-In' -Profile 'Any' -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portvalue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remote Desktop servisini yeniden başlatmayı unutmayın.&lt;/p&gt;

&lt;p&gt;*_-&lt;/p&gt;

</description>
      <category>windows</category>
      <category>remotedesktop</category>
      <category>powershell</category>
    </item>
  </channel>
</rss>
