Yeni bir sunucuya ilk erişiminizde, genellikle bir dizi manuel adımı takip edersiniz: kök kullanıcıyı devre dışı bırakmak, SSH erişimini yalnızca anahtar tabanlı olarak sınırlandırmak, varsayılan reddetme politikasına sahip bir güvenlik duvarı kurmak ve sistem güncellemelerini otomatikleştirmek. Bu adımlar her sunucuda titizlikle uygulandığında bile, zamanla küçük farklılıklar oluşabilir — bazı sunucularda MaxAuthTries 3 ayarı bulunurken, diğerlerinde bulunmayabilir. Özellikle acil durumlarda yapılan hızlı kurulumlarda, bu tutarsızlıkların ortaya çıkma olasılığı artar.
Bu sorunun üstesinden gelmenin en etkili yolu, tüm bu adımları otomatikleştiren bir Ansible Playbook hazırlamaktır. Aynı adımlar her seferinde, aynı sırayla ve herhangi bir sunucuda tutarlı bir şekilde uygulanır. Üstelik, Ansible'ın idempotent yapısı sayesinde, zaten yapılandırılmış bir sunucuya playbook'u tekrar çalıştırdığınızda hiçbir değişiklik yapılmaz. Böylece, hem zaman kazandırır hem de insan hatasını en aza indirir.
Ansible Playbook'un yapılandırılması
Aşağıdaki playbook, yeni bir sunucunun güvenlik tabanını oluşturmak için gerekli temel adımları içerir. Playbook'un tamamı, yalnızca birkaç görevden oluşmakta ve sistemlerinize uygulanacak ilk katman olarak tasarlanmıştır. Bu sayede, uygulama düzeyindeki yapılandırmalardan bağımsız olarak çalışır ve zamanla değişmeden kalır.
Öncelikle, bir baseline.yml dosyası oluşturun ve içerisine aşağıdaki yapılandırmayı ekleyin:
---
- name: Yeni sunucu için temel güvenlik ayarları
hosts: new_servers
become: true
vars:
admin_user: deploy
ssh_public_key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
tasks:
- name: Yönetici kullanıcısı oluştur
user:
name: "{{ admin_user }}"
groups: sudo
shell: /bin/bash
create_home: true
- name: Yönetici kullanıcısı için SSH anahtarı ekle
authorized_key:
user: "{{ admin_user }}"
key: "{{ ssh_public_key }}"
- name: SSH yapılandırmasını güçlendir (bulut başlatma ayarlarını geçersiz kılar)
copy:
dest: /etc/ssh/sshd_config.d/99-hardening.conf
content: |
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
mode: '0644'
notify: sshd hizmetini yeniden başlat
- name: UFW ve Fail2ban yükle
apt:
name: [ufw, fail2ban]
state: present
update_cache: true
- name: UFW varsayılan kurallarını ayarla
ufw:
direction: "{{ item.direction }}"
policy: "{{ item.policy }}"
loop:
- { direction: incoming, policy: deny }
- { direction: outgoing, policy: allow }
- name: Gerekli portları aç
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop: ['22', '80', '443']
- name: UFW'yi etkinleştir
ufw:
state: enabled
- name: Fail2ban hizmetini etkinleştir
systemd:
name: fail2ban
enabled: true
state: started
- name: Otomatik güncellemeleri yükle
apt:
name: unattended-upgrades
state: present
handlers:
- name: sshd hizmetini yeniden başlat
systemd:
name: ssh
state: restartedBu playbook, yeni bir sunucu için gerekli temel güvenlik ayarlarını otomatik olarak uygular. admin_user olarak adlandırılan bir yönetici kullanıcısı oluşturur, SSH erişimini yalnızca anahtar tabanlı olarak sınırlandırır ve sistem güvenlik duvarını varsayılan reddetme politikasına göre yapılandırır. Ayrıca, otomatik güncellemeleri etkinleştirerek sisteminizin sürekli olarak güncel kalmasını sağlar.
Playbook'un çalıştırılması
Playbook'u yeni bir sunucuya uygulamadan önce, sunucunun inventory.ini dosyasına eklenmesi gerekir. Örneğin:
[new_servers]
new-server-01 ansible_host=192.168.1.100 ansible_user=rootPlaybook'u ilk kez çalıştırmak için aşağıdaki komutu kullanabilirsiniz:
ansible-playbook -i inventory.ini baseline.yml -l new-server-01 -u rootBu komut, root kullanıcısı olarak bağlanarak playbook'un tüm görevlerini yerine getirir. Playbook tamamlandığında, root kullanıcısının SSH erişimi devre dışı bırakılır ve deploy kullanıcısı yeni giriş noktası haline gelir. Artık, gelecekteki tüm çalıştırmalarınızda deploy kullanıcısını kullanabilirsiniz:
ansible-playbook -i inventory.ini baseline.yml -l new-server-01 -u deployPlaybook'un çalıştırılması sırasında, yalnızca SSH yapılandırmasında bir değişiklik yapılmışsa sshd hizmeti yeniden başlatılır. Bu sayede, playbook'un her çalıştırılmasında gereksiz yere hizmetin durdurulmasının önüne geçilir.
Idempotentlik: Tutarlılığın anahtarı
Bu playbook'un en büyük avantajı, idempotent olmasıdır. Bu terim, playbook'un aynı sunucuya tekrar tekrar çalıştırıldığında, sistemde zaten uygulanmış olan ayarlar için hiçbir değişiklik yapmayacağı anlamına gelir. Altı ay sonra, hangi sunucunun hangi ayarları aldığını hatırlamak zorunda kalmazsınız. Playbook'u tekrar çalıştırdığınızda, sistem zaten doğru şekilde yapılandırılmışsa Ansible size hiçbir değişiklik olmadığını bildirir. Eğer bir ayar eksikse, playbook onu hemen tamamlar.
Bu playbook, yalnızca birkaç görevden oluşacak şekilde tasarlanmıştır. Uygulama yığınlarını veya proje özel ayarlarını içermez. Bunun yerine, her sunucunun temelini oluşturan katman olarak hareket eder. Uygulama düzeyindeki playbook'larla bir arada kullanıldığında, güvenlik tabanı sabit kalır ve zamanla güvenilirliğini korur.
Yeni bir sunucuya her başladığınızda, temel güvenlik ayarlarını manuel olarak uygulamak yerine, bu playbook'u kullanarak süreci otomatikleştirin. Böylece, hem zaman kazanın hem de sistemlerinizin tutarlı ve güvenli kalmasını sağlayın.
Yapay zeka özeti
Yeni sunucularınıza hızlı ve tutarlı şekilde güvenlik ayarları uygulamak için basit bir Ansible Playbook hazırlayın. SSH, UFW, Fail2ban ve otomatik güncellemeler için adım adım rehber.