27 Aralık 2020 Pazar

Demilitarized Zone - DMZ

DMZ'nin Amacı Nedir?
Açıklaması şöyle. Yani sunucularımıza nasıl olsa saldırı olacak ancak tüm kurumdaki bilgisayarları da aynı tehlikeli bölgeye koymaya da gerek yok.
The reason to have a DMZ -- the purpose to all this isolation -- is to keep the public, internet facing services in a place that their compromise doesn't expose your entire enterprise. The DMZ is where you put the "dirty" systems -- the things people are going to attack. They're kept in their own network with their own set of extremely restrictive access rules where they can be monitored diligently.
DMZ'de bulunan bir web sunucu, iç ağda bulunan veri tabanına erişebilir. Böylece veri tabanı internete açılabilir. 

Genellikle iki çeşit DMZ konfigürasyonu var
1. Tek firewall kullanan DMZ
2. Çift firewall kullanan DMZ

Tek Firewall Kullanan DMZ
Açıklaması şöyle
The firewall has three interfaces each attached to a network. Hosts in the DMZ would need to traverse the firewall to reach systems in the private network,... . The private network can access the Internet and the DMZ to use its services or manage the servers.
Çift Firewall Kullanan DMZ
Genellikle şöyledir
Firewall 1<--> Sunucular (DMZ) <--> Firewall 2<--> Şirket İç Ağı
Açıklaması şöyle
Other DMZ designs use two serial firewalls, with the DMZ in between. This setup is more complicated but adds another layer of security. In the first design, if the firewall is compromised due to a vulnerability or is somehow misconfigured the private network might be exposed to attacks. With two firewalls between the external and the private network now two devices would need to be compromised to get access. We can add even more security employing two different firewall vendors so an exploit found in one is unlikely to be present in the other, although this also adds more complexity.
Açıklaması şöyle
Having one firewall for internal LANs, and one for DMZ(s) does provide greater isolation between the two. The DMZ(s) can be completely, physically, isolated from the rest of the enterprise. Rarely is that level of security and isolation required. (military, banks, etc.) 

24 Aralık 2020 Perşembe

kubectl get services seçeneği

Giriş
get services ve get svc aynı şeyler. 5 tane sütunlu bir çıktı verir. service ve pod farklı şeyler. Farkını gösteren bir şekil burada. Servis podlar tetikleyen yapıdır.
+---------------------+
| hello-world-service |
|                     |
|    10.15.242.210    |
+---------O-----------+
          |
          +-------------O--------------------------O
                        |                          |
              +---------O-----------+    +---------O-----------+
              |        pod 1        |    |        pod 2        |
              |                     |    |                     |
              |     hello-world     |    |     hello-world     |
              +---------------------+    +---------------------+
Örnek
Şöyle yaparız
kubectl get services --namespace yb-demo
Örnek
Şöyle yaparız
$ kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hello-world-service   ClusterIP   10.15.242.210   <none>        8080/TCP   5s
kubernetes            ClusterIP   10.15.240.1     <none>        443/TCP    7h
Örnek
Şöyle yaparız
kubectl get svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
sa-frontend-lb   LoadBalancer   10.101.244.40   <pending>     80:30708/TCP   7m

16 Aralık 2020 Çarşamba

snap komutu - Package Manager

Giriş
snap paketlerinin çıkış noktası .deb paketlerinin sadece tek bir Linux türevi ve sürümü için çalışması. Açıklaması şöyle
In Linux, packages are specifically built for a single version of a single distribution. With a lot of tweaking, it is possible to make one .deb package that runs on all Debian based systems, but this is complicated and limits developers.

If I create a deb package for Ubuntu 20.04, it will only work on that version. I also have to make a different package for 16.04, 18.04, 19.10 and so on. I already have to make four packages just for Ubuntu. I also need to make one for every Debian version, every Fedora version and every openSUSE version.

This means if I want to release a new version of my application, I have to create over 20 packages to cover the majority of Linux distributions, and that still won't cover every distro.
snap ile amaç snap paketleme sistemini kullanan her sistemde çalışacak tek bir paket yaratmak. 
Bu yüzden snap paketleri biraz daha büyük oluyor. Açıklaması şöyle
Difference between the packages

- APT packages are compiled and tested for a specific version of Ubuntu. During the lifetime of the Ubuntu version, the LibreOffice version will essentially remain the same. Only minor security updates are provided.

- snap versions, on the other hand, are containerized and thus will run in a range of Linux distributions without change. That is a significant advantage of the latter packaging version. That also makes it much more manageable to regularly update the package. Therefore, you will typically see that the snap is a newer version. A disadvantage is that snaps use more disk space and, currently, still are somewhat slower during initial startup.
Snap Alternatifleri
- "GNOME Software Center" kullanılabilir.
- "Ubuntu Software Center" kullanılabilir.
- Pip ve apt zaten diğer çok bilinen Package Manager'lar. Açıklaması burada.

Bu Nasıl Mümkün Oluyor?
debian paketleri bağımlı oldukları her dosyayı içermezler. snap paketleri ise yekpare bir pakettir. İhtiyaç duydukları her şeyi beraberinde getirir. Açıklaması şöyle
Snappy package contains all the required files, where .deb packages have dependencies to other packages.

The negative side is that snappy is bigger because it contains all the files. But the big advantage is that you don't get in trouble with other packages and if you remove this package, no other package will be affected by missing dependencies.
install seçeneği
Örnek
Şöyle yaparız
snap install onlyoffice-desktopeditors
Örnek
Şöyle yaparız
sudo snap install libreoffice
list seçeneği
Örnek
Şöyle yaparız
snap list
purge seçeneği

remove seçeneği
remove seçeneği ile alt seçenekler de kullanılabilir. Açıklaması şöyle
[remove command options]
      --no-wait     Do not wait for the operation to finish but just print the change id.
      --revision=   Remove only the given revision
      --purge       Remove the snap without saving a snapshot of its data
Örnek
snap yeteneğini tamamen kaldırmak için şöyle yaparız
sudo snap remove snap-store
Örnek
Şöyle yaparız. Burada --purge kullanılıyor
snap remove firefox --purge
Örnek
Şöyle yaparız
sudo snap remove vlc

sudo apt update && sudo apt install vlc








chroot komutu

Giriş
chroot bir Linux sistem çağrısıdır. Çalışan bir uygulamanın kök dizininin değiştirilmesini sağlar. chroot daha çok uygulamalar için sanal bir ortam hazırlamak için kullanılır. Bu sanal ortama chroot jail adı verilir.

Kodla
Örnek
Şöyle yaparız
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/chroot";
int main(int c, char **v, char **e) {
    int rc; const char *m;
    if ( (m="chdir" ,rc=chdir(newroot)) == 0
      && (m="chroot",rc=chroot(newroot)) == 0
      && (m="setuid",rc=setuid(getuid())) == 0 )
            m="execve", execve(v[1],v+2,e);
    perror(m);
    return 1;
}
Örnek
Yeni bir dizin yaratalım
mkdir -p /home/foo
/bin/bash uygulamalasını tüm dependency kütüphaneler ile bu dizine kopyalayalım ve çalıştıralım
chroot /home/foo /bin/bash
Yeni açılan bash sanal bir ortamda çalıştığı için diğer hiç bir uygulamayı (ls,mkdir gibi) bulamaz. 
Çıkmak için exit komutunu kullanırız.

 --userspec seçeneği
Açıklaması şöyle
Although you need to invoke chroot as root, the chroot option --userspec=USER:GROUP will run the command under the non-root UID/GID.

6 Aralık 2020 Pazar

dhcpd

Giriş
Konfigürasyon dosyası burada
/etc/dhcp/dhcpd6.conf
Örnek
Şöyle yaparız
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:3f3e;
option dhcp6.domain-search "test.example.com","example.com";
option dhcp6.info-refresh-time 21600;

ddrescue komutu

Giriş
fill-mode seçeneği
Açıklaması şöyle
When ddrescue is invoked with the option --fill-mode it operates in "fill mode", which is different from the default "rescue mode". That is, in "fill mode" ddrescue does not rescue anything. It only fills with data read from infile the blocks of outfile whose status character from mapfile coincides with one of the type characters specified in the argument to --fill-mode.

[…]

In fill mode mapfile is updated to allow resumability when interrupted or in case of a crash, but as nothing is being rescued mapfile is not destroyed. The status line is the only part of mapfile that is modified.

[…]

Example 2: Wipe only the good sectors, leaving the bad sectors alone. This way, the drive will still test bad (i.e., with unreadable sectors). This is the fastest way of wiping a failing drive, and is especially useful when sending the drive back to the manufacturer for warranty replacement.
Örnek
Şöyle yaparız
ddrescue --fill-mode=+ --force /dev/zero bad_drive mapfile

rev komutu - reverse İçindir

Giriş
Bu komut standart bi komut değil. Ayrıca kurmak gerekiyor. 
Verilen girdiyi tersine çevirir.

Örnek
Bir satıdaki en sonuncu tab delimited alanı almak için şöyle yaparız
rev | cut -f 1 | rev


1 Aralık 2020 Salı

openssl req aracı İle Self Signed Certificate Üretmek

Giriş
Self signed certificate üretmek için kullanılabilecek araçlardan birisi de openssl req komutu. Açıklaması şöyle.
This option outputs a self signed certificate instead of a certificate request. This is typically used to generate a test certificate or a self signed root CA.
Üretilen sertifika x509 formatında. Bu sertifikanın içine bakmak için "openssl x509" komutu kullanılabilir.

Örnek
Sertifikaya bakmak için şöyle yaparız
openssl x509 -in myserver.crt -text -noout

Java'daki keytool İle Karşılaştırması
Java'daki keytool private key ve sertifikayı tek bir dosya içinde kolayca topluyor. Bu dosya java uygulamalarından rahatça kullanılıyor. 

Ancak "openssl req" aracı iki tane farklı dosya üretiyor. 

Komut Çıktısı
İki tane dosya çıktısı olur "cert.pem" ve "privatekey.pem". Bu dosyalara bezen ".crt" ve ".key" uzantıları da veriliyor. Bir tanesi sertifika, diğeri de private key dosyasıdır.

Private key dosyasında modulus + public exponent + private exponent bilgisi vardır. Private key dosyasını incelemek için openssl rsa aracı kullanılabilir.

Pem Formatında Sertifikanın İçi
cert.pem şöyledir.
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Pem Formatında Private Key Dosyasının İçi
privatekey.pem şöyledir.
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,58E20DDB682C7B7A
...
-----END RSA PRIVATE KEY-----
Açıklaması şöyle
encoded and created in a Base-64 based PEM format which is not human-readable
Seçenekler
days :seçeneği ile sertifikanın kaç gün geçerli olacağı belirtilir.
newkey :seçeneği ile kullanılacak algoritma belirtilir. Genellikle rsa:1024 , rsa:2048 , rsa:4096 seçilir.
sha256 :  Sertifika içinde kullanılacak Signature Algorithm 'in ne olacağını belirtir. Bu parametre mecburi değildir. Basit bir açıklama şöyle
... the server sends a chain of certificates. Each certificate in the chain contains a public key, a name (a domain for the server, an organization name for a CA), some extra information, and a signature covering all that. The signature was created by the private key of the next certificate in the chain, and can be verified by that certificate's public key.
nodes : Açıklaması şöyle. Private key dosyasının şifrelenmemesini sağlar.
The option -nodes is not the English word "nodes", but rather is "no DES". When given as an argument, it means OpenSSL will not encrypt the private key in a PKCS#12 file.
keyout :seçeneği ile private key dosyası belirtilir.
out : seçeneği ile sertifika dosyası belirtilir.
x509: openssl req ile CSR veya sertifika üretilebilir. Sertifika üreteceğimizi belirtir.

1. -new seçeneği
Burada sadece -new seçeneği belirtiliyor. -newkey belirtilmiyor yani kullanılacak algoritmayı seçmiyoruz.
Örnek
Şöyle yaparız
openssl req -nodes -new -x509 -keyout private.pem -out server.cert
Çıktı olarak şunu alırız
Generating a 2048 bit RSA private key
..................................+++
..................................................................+++
writing new private key to 'private.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields, but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:US
State or Province Name (full name) []:IN
Locality Name (eg, city) []:Zionsville
Organization Name (eg, company) []:JVC
Organizational Unit Name (eg, section) []:Development
Common Name (eg, fully qualified host name) []:Planning Poker
Email Address []:<my-email-address-was-entered-here>
2. -newkey seçeneği
Kullanılacak algoritmayı seçiyoruz
Örnek -  rsa:4096
Şöyle yaparız
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out
MyCertificate.crt -keyout MyKey.key
Örnek  rsa:2048
Şöyle yaparız.
openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \
-keyout private/vsftpd.key \
-out certs/vsftpd.crt
Örnek - rsa:2048
Şöyle yaparız.
openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -days XXX
Örnek  - rsa:2048
Şöyle yaparız.
openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -days 30
Örnek - rsa:2048
Şöyle yaparız
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout localhost-privatekey.pem -out localhost-certificate.pem
Örnek - rsa:1024
Host ismi vermek için şöyle yaparız
openssl req -x509 -newkey rsa:1024 -keyout privatekey.pem -out cert.pem -days 999
  -subj "/CN=localhost"
3. -keyout seçeneği
Örnek
Şöyle yaparız
openssl req -new \
    -newkey rsa:4096 \ # Kullanılacak algoritma
    -nodes \ # Private key dosyasını şifreleme
    -x509 \ # Self signed sertifika üret
    -days 3650 \  # 10 yıl geçerli olsun
    -keyout self_signed.key \ #Private key dosyası
    -out self_signed.pem \ # Sertifika dosyası
    -subj '/CN=TestCertificate/C=US/ST=CA/L=SF/O=Test' # Sertifikaya girdi

4. -key seçeneği
Örnek
Normalde private key vermeye gerek yoktur. Eğer kendimiz vermek istersek şöyle yaparız
# Generate private key
openssl genrsa -des3 -out myCA.key 2048
# Generate root certificate
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem
# Convert to Botan Format
openssl pkcs8 -topk8 -in myCA.key > myCAKey.pkcs8.pem

find komutu path seçeneği - glob/wildcard Kullanır

Giriş
Aranacak dizin ismini belirtir. Wildcard kullanılabilir. Başlanılan dizin çıktıya dahil edilir. Açıklaması şöyle
find includes the directories from which it starts
Örnek
Çıktıda . karakteri olduğunu görmek için şöyle yaparız
$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
Örnek
Çıktıda . yani başlangıç dizinini görmek istemiyorsak "-not -path ." veya "! -path ." şeklinde kullanırız. Şöyle yaparız
find . -maxdepth 1 -not -path . | wc -l
find $HOME -maxdepth 1 -not -path $HOME | wc -l
Örnek
Elimizde şöyle bir dizin yapısı olsun
a
├── b
│   └── e
├── c
│   └── e
└── d
Sadece c dizini içindeki e dizinlerini bulmak için şöyle yaparız
$ find . -path '*/c/e'
./a/c/e
Örnek
mp3 dosyalarını bir üst dizine taşımak için şöyle yaparız.
find . -path "*/flac/*" -name '*.mp3' -execdir mv -t ../ {} +