Category Archives: Linux

WordPress gizli anahtarlar

WordPress’te güvenlik için yüklemeden sonra wp-config.php dosyasındaki gizli anatarlar rastgele karakter dizileriyle değiştirilmeli. Bu rastgele dizileri üretmek için şu araç kullanılabilir:

WordPress Secret Key Generator

Not: bu anahtarlar değiştirildikten sonra giriş yapmış kullanıcıların tekrar giriş yapmaları gerekecektir.

iptables’da Belirli Bir Satırı Silmek

iptables kurallarını satır numaralarıyla görmek için:

iptables -vnL --line-numbers

 

Daha sonra 14 numaralı satırı silmek için:

iptables -D INPUT 14

 

Web Sunucusu İçin Basit Bir iptables Yapılandırması

Basit bir web sunucusunda güvenlik için Apache, MySQL, DNS, FTP ve SSH servislerinin kullandığı portlar dışında kalanları engellemek gerek.

Aşağıdaki betikte SSH için 22. portun kullanıldığı varsayılmıştır. MySQL varsayılan ayarlarıyla çalıştırıldığında 3306 portunu kullanır. Aşağıdaki betikte localhost’tan gelen tüm paketleri kabul etmek için loopback arayüzünden gelen tüm paketlere izin verilmiştir. Bu sayede MySQL dışında localhost’tan çalışan diğer uygulamalara da izin verilmiş oldu. FTP işi biraz daha çetrefilli. FTP aktif modla bağlandığında 21. portu kontrol için, 20. portu da veri iletimi için kullanır. Ama pasif modla bağlandığında ilk bağlantıdan sonra FTP istemcisi daha yüksek portları da kullanmak isteyebilir. Bunun için ip_conntrack çekirdek modülü kullanılarak kurulmuş bağlantılarla ilgili olan bağlantılara izin verilmiştir. ip_conntrack’in yüklenmesi aşağıda açıklanmıştır.

Bazı IP’lerin ve subnet’lerin yasaklanması için örnek satırlar da verilmiştir. Yanlışlıkla engellenmemesi için Cloudflare CDN hizmetinin kullandığı IP adresleri beyaz listeye alınmıştır.

iptables kuralları yukarıdan aşağıya doğru işletilir, gelen paketin uyduğu ilk satır işlendikten sonra diğerleri atlanır. Kuralların sonuna kadar gelindiğinde, bir paket için hala uygun bir kural bulunamamışsa, prensip (Policy) işletilir. Aşağıdaki örnekte prensip DROP olarak belirlenmiştir.

### IP v4 ###

# SSH
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# Web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# MySQL (ve localhost'tan gelen diğer istekler) 
iptables -I INPUT -i lo -j ACCEPT

# FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# DNS
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# Yasaklı IPler
iptables -I INPUT 3 -s YASAKLI_IP/24 -j DROP
iptables -I INPUT 3 -s YASAKLI_IP -j DROP

# Cloudflare
iptables -I INPUT 3 -s 103.21.244.0/22 -j ACCEPT
iptables -I INPUT 3 -s 103.22.200.0/22 -j ACCEPT
iptables -I INPUT 3 -s 103.31.4.0/22 -j ACCEPT
iptables -I INPUT 3 -s 104.16.0.0/12 -j ACCEPT
iptables -I INPUT 3 -s 108.162.192.0/18 -j ACCEPT
iptables -I INPUT 3 -s 141.101.64.0/18 -j ACCEPT
iptables -I INPUT 3 -s 162.158.0.0/15 -j ACCEPT
iptables -I INPUT 3 -s 172.64.0.0/13 -j ACCEPT
iptables -I INPUT 3 -s 173.245.48.0/20 -j ACCEPT
iptables -I INPUT 3 -s 188.114.96.0/20 -j ACCEPT
iptables -I INPUT 3 -s 190.93.240.0/20 -j ACCEPT
iptables -I INPUT 3 -s 197.234.240.0/22 -j ACCEPT
iptables -I INPUT 3 -s 198.41.128.0/17 -j ACCEPT
iptables -I INPUT 3 -s 199.27.128.0/21 -j ACCEPT

# Policy
iptables -P INPUT DROP

### IP v6 ###

# Web
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

# MySQL
ip6tables -I INPUT -i lo -j ACCEPT

# DNS
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT

# Yasaklı IPler

# Cloudflare
ip6tables -I INPUT 3 -s 2400:cb00::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2405:8100::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2405:b500::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2606:4700::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2803:f800::/32 -j ACCEPT

# Policy
ip6tables -P INPUT DROP

ip_conntrack modülünü yüklemek için şu komutu kullanabilirsiniz:

modprobe ip_conntrack_ftp

iptables kuralları bilgisayar yeniden başlatıldığında silinir. Kurallarınızı kaydetmek için iptables-persistent programını yükleyebilirsiniz:

apt-get install iptables-persistent

Bu program kurallarınızı /etc/iptables/rules.v4 ve /etc/iptables/rules.v6 dosyalarına kaydeder ve sistem tekrar başlatıldığında tekrar bu dosyalardan yükler.

ip_conntrack modülünün bilgisayar yeniden başlatıldığında tekrar yüklenmesi için ise /etc/init.d/iptables-persistent dosyasında load_rules() fonksiyonunun en üstüne aşağıdaki satırı ekleyebilirsiniz:

 /sbin/modprobe -q ip_conntrack_ftp

 

Kaynak:
http://bencane.com/2012/09/iptables-linux-firewall-rules-for-a-basic-web-server/
https://www.cloudflare.com/ips

Sitenize dadanmış sömürgenleri bulun

Apache loglarını incelerken bazı IP’lerden arka arkaya çok fazla istek geldiğini farkettim. Ama gözle bunları tespit etmek neredeyse imkansız olduğu için C++ ile şöyle bir programcık yazdım.

sivri

/*
* copyLeft by Mustafa Aldemir
* 18.05.2015
* find the IPs that make too many requests 
*/
#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
 
using namespace std;
 
int main(int argc, char* argv[])
{
  map<string, int> mymap;
  string s;
  int limit;
  int size;
 
  if(argc==2){
    limit = atoi(argv[1]);
  } else {
    cout << "Usage:" << endl << "tail -f /var/log/apache2/access.log | awk -Winteractive '{print $1}' | findleechers 10" << endl;
    return 0;
  }
 
  cout << "limit: " << limit <<endl;
 
  while (cin >> s)
  {
    if ( mymap.count(s)>0 ){
      mymap[s]++;
      if ( (limit <= mymap[s]) && (0 == (mymap[s]%limit)) ){
        cout << s << " " << mymap[s] << endl;                                                                                            
      }                                                                                                                                  
    } else {
      mymap.insert( pair<string,int>(s,1) );
    }
 
    size = mymap.size();
    if(10000 < size){
      cout << "Exiting: size has grown too big" << endl;
      return 0;
    }
    /*
    if(0 == (size % 100)){
      cout << "map size: " << size << endl;
    }
    */
  }
 
 return 0;
}
 

 

Derlemek için:

g++ findleechers.cpp  -o findleechers 

 

Derledikten sonra diğer kendi yazdığım programların yanına /usr/local/bin klasörüne taşıdım.

Çalıştırmak için şu komutu kullanıyorum:

tail -f /var/log/apache2/access.log | awk -Winteractive '{print $1}' | findleechers 10

 

Bu programı çalıştırmaya çalışırken yeni bir şey öğrendim. awk komutu veriyi tamponluyormuş (buffer) [1]. Yani, awk’ın çalışması bitene kadar findleechers borudan (pipe) bir şey alamıyordu. tail komutunu da -f ile çalıştırdığım için awk’ın çalışması hiç bitmiyordu. -W interactive parametresi ile kendisine gelen veriyi buffer’lamadan çalışmasını sağladım.

Kaynak:
[1] http://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html

iptables Çalışması Yaparken Kendinizi Engellemeyin

Birkaç kez başıma geldiği için iptables kurallarında değişiklik yaparken kendi kendimi sunucuya erişemez hale getirmemek için mümkün olduğunca dikkatli davranıyorum. Kendimi de engelleyecek bir kural yaz ihtimaline karşı bir önlem olarak aşağıdaki script’i crontab’a koyup 5 dakikada bir çalıştırıyorum. Bu sayede en kötü ihtimalle 5 dk sonra iptables kuralları temizleniyor ve sunucuya erişebiliyorum.

Not: Ben bu script’i Ubuntu sunucuda kullanıyorum. iptables’ı Redhat, Centos vb. işletim sistemlerinde /etc/init.d/iptables stop ile durdurmak yeterliymiş.

#!/bin/bash
# reset.fw – Reset firewall
# Written by Vivek Gite [email protected]
# You can copy / paste / redistribute this script under GPL version 2.0 or above
# =============================================================

IPT=/sbin/iptables
IPT6=/sbin/ip6tables

### reset ipv4 iptales ###
$IPT -F
$IPT -X
$IPT -Z
for table in $(chmod +x /usr/local/bin/reset_fw.sh

Sonra da cron’a 5 dakikada bir çalıştırılmak üzere kaydettim.

crontab -e
*/5 * * * * /usr/local/bin/resetfw.sh >/dev/null 2>&1

Ubuntu Güncelleme Problemi

Ubuntu’da güncelleme yapmak istediğimde şöyle bir hata mesajı aldım:

# sudo apt-get update
Failed to fetch http://de.archive.ubuntu.com/ubuntu/dists/trusty-updates/universe/source/Sources Hash Sum mismatch

Güncelleme için indirilen paketlerde bir sıkıntı olduğunu düşünüp şunu yaptım:

# sudo apt-get clean
rm -rf /var/lib/apt/lists/*
rm -rf /var/lib/apt/lists/partial/*
apt-get clean
apt-get update

ama bu sefer de şöyle bir hata aldım:

W: GPG error: http://de.archive.ubuntu.com trusty-updates Release: The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key

ben de önce bir kernel güncellemesi yaptım, sonra da autoremove’la eski kernel paketlerini kaldırdım:

# sudo apt-get dist-upgrade
# sudo apt-get upgrade
# sudo apt-get autoremove

şu uyarı bir an için tedirgin etti, sonuçta uzaktaki bir makine, boot esnasında oluşan bir probleme müdahale etmek zahmetli.

The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old
you may need to re-run your boot loader[grub]

ama sadece GRUB’ı güncellemek yeterliymiş:

#sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.13.0-46-generic
Found initrd image: /boot/initrd.img-3.13.0-46-generic
Found linux image: /boot/vmlinuz-3.13.0-35-generic
Found initrd image: /boot/initrd.img-3.13.0-35-generic
done

şimdi herşey yolunda

Raspberry Pi’a Android yüklemek

Raspberry Pi için Android’in güncel sürümleri hala port edilmedi. Ben de mecburen 2.3 versiyonuyla deniyorum. En az 4GB’lık bir SD karta Win32 Disk Imager programını kullanarak CyanogenMod 7.2 (custom Android ROM for Raspberry Pi) imajını yazdım.

Performansı …

Raspberry Pi Disk Bölümlerini Windows’ta Silmek

Raspberry Pi için kullandığım SD karta Windows’ta yeni bir imaj yazmak istedim. Computer Management’ın Disk Management ekranından girdiğimde diskimde 2 bölüm olduğunu gördüm ama bunları silmeme izin vermedi. Ben de `diskpart` komutunu kullandım.

Dikkat: diskpart’ı kullanırken, doğru diski ve bölümü seçtiğinizi bir kez daha kontrol edin. Yanlışlıkla sisteminizin yüklü olduğu bölümü silebilirsiniz, sonra çok uğraştırır 🙂

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\WINDOWS\system32>diskpart

Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: MD1EQ0RC

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          232 GB  1024 KB
  Disk 1    Online          465 GB      0 B
  Disk 2    Online         7580 MB      0 B

DISKPART> select disk 2

Disk 2 is now the selected disk.

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    Primary           1468 MB  4096 KB

DISKPART> select part 1

Partition 1 is now the selected partition.

DISKPART> delete part

DiskPart successfully deleted the selected partition.

DISKPART> create part pri

DiskPart succeeded in creating the specified partition.

DISKPART> list partition

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
* Partition 1    Primary           7579 MB  1024 KB

DISKPART> exit

Leaving DiskPart...

C:\WINDOWS\system32>

 

Bash Bug – Linux’ta Önemli Güvenlik Açığı

bash’te çok önemli bir güvenlik açığı bulundu, acilen güncellenmesi gerekiyor. Ama eski dağıtımlarda desteklenmeyebilir. Muhtemelen önümüzdeki günlerde adını çok duyacağız.

Güncellemeden önce şöyle görüyordum:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 vulnerable
 this is a test

Güncellemeden sonra şöyle oldu:

 $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 bash: warning: x: ignoring function definition attempt
 bash: error importing function definition for `x'
 this is a test

bkz.

http://www.theverge.com/2014/9/24/6840697/worse-than-heartbleed-todays-bash-bug-could-be-breaking-security-for

http://www.theregister.co.uk/2014/09/24/bash_shell_vuln/

Bilgisayarı tekrar başlatmadan /etc/fstab’ı yüklemek

/etc/fstab dosyası bilgisayar ayağa kalkarken disklerin nasıl bağlanacağını belirleyen ayar dosyasıdır. Bu dosyayı değiştirdikten sonra bilgisayarı tekrar başlatmak gerekir. Ancak bu dosya hatalıysa dosya sistemleri doğru bağlanamaz ve bilgisayarınız düzgün bir şekilde ayağa kalkmayabilir.

Bilgisayarı tekrar başlatmadan dosya sistemlerini bu ayar dosyasına göre bağlamak için

mount -a

komutu kullanılabilir.