Category Archives: Sistem Yönetimi

Ubuntu 16.04’te OpenCV Derlemek

Anaconda’nın içindeki Python’ı kullanmak istediğimde hata aldım. Ubuntu ile gelen Python’ı kullandım.

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local  \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D BUILD_EXAMPLES=ON \
    -D PYTHON_INCLUDE_DIR=~/anaconda3/include/python3.6m \
    -D PYTHON_LIBRARY=~/anaconda3/lib/libpython3.6m.so \
    -D PYTHON2_EXECUTABLE=/usr/bin/python2.7 \
    -D PYTHON2_INCLUDE_PATH=/usr/lib/python2.7/dist-packages \
    -D PYTHON2_LIBRARIES=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ../

make -j4
sudo make install
sudo ldconfig

Kaynak: http://www.pyimagesearch.com/2016/10/24/ubuntu-16-04-how-to-install-opencv/

Bütün OpenWrt paketlerini tek komutta güncellemek

opkg list-upgradable | awk -F ' - ' '{print $1}' | xargs opkg upgrade

 

   _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M

Systemctl ile Systemd Servislerini Yönetmek

Bir ilklendirme sisteminin (init system) amacı Linux kerneli ayağa kalktıktan (boot ettikten) sonra başlatılması gereken bileşenleri ilklendirmektir. İlklendirme sistemi, sistem başladıktan sonra herhangi br zamanda servisleri ve arka planda çalışan programları (daemon) kontrol etmek için de kullanılır.

systemd Linux dağıtımları arasında hızla yaygınlaşan bir ilklendirme sistemi ve sistem yöneticisidir. Ubuntu da 16.04 versiyonunda eskiden kullandığı Upstart’ı systemd ile değiştirdi. systemctl komutu ise systemd’yi kontrol etmeye yarayan temel komuttur.

Continue reading

Cloudflare API’ına Konsoldan Erişmek

Cloudflare neredeyse bütün fonksiyonlarını kontrol edebileceğiniz bir API sunuyor. Bunu PHP, Perl, Java, Python vs. çeşitli dillerde yazdığınız programlarda kullanabilirsiniz. Ayrıntılı döküman şurada: https://www.cloudflare.com/docs/client-api.html

Daha önce Apache loglarını inceleyip XMLRPC saldırısı yapan IP’leri belirleyen bir betik yazmıştım. Tespit ettiği IP’leri bana eposta ile bana gönderiyordu. Şimdi bunu güncelleyip, otomatik olarak Cloudflare Firewall’undan engelleyen bir hale çevirdim. Son hali şöyle oldu:

 

#!/bin/bash
if [ "$#" -ne 1 ];
then
  LIMIT=100
else
  LIMIT=$1
fi
 
MY_EMAIL=""
CLOUDFLARE_API_KEY=""
DATE=`date`
LIST="\nMore than $LIMIT:"
WARNING="\nMore than $LIMIT:\n"
IPTABLES="\niptables command:"
TOTAL=0
 
echo -e "### xmlrpc Attack Detection ###\n$DATE\n"
 
for IP in $(grep "POST /xmlrpc.php" /var/log/apache2/access*log | awk '{print $1}' | awk -F ':' '{print $2}' | sort | uniq)
do
  COUNT=`grep $IP /var/log/apache2/*.log | grep xmlrpc.php | wc -l`
 
  if [[ "$COUNT" -gt $LIMIT ]];
  then
    CLOUDFLARE=`curl -s https://www.cloudflare.com/api_json.html \
      -d 'a=ban' \
      -d 'key='$IP \
      -d 'tkn='$CLOUDFLARE_API_KEY \
      -d 'email='$MY_EMAIL`
 
    echo "IP: $IP count: $COUNT"
    LIST="$LIST\n$IP"
    WARNING="$WARNING\n$IP     => count: $COUNT\n$CLOUDFLARE\n"
    IPTABLES="$IPTABLES\niptables -I INPUT 1 -s $IP -j DROP"
    ((TOTAL=$TOTAL+1))
  fi
done
echo "Total: $TOTAL IP addresses"
 
echo -e $LIST
echo -e $IPTABLES
 
if [[ "$TOTAL" -gt 0 ]];
  then
  echo -e $WARNING |mail -s "xmlrpc attack warning" $MY_EMAIL
fi

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

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/