AHTAPOT |
Ansible Playbook Dökümantasyon
u
Bu dökümanda, AHTAPOT projesi kapsamında, merkezi yönetim uygulaması olarak kullanılan Ansible üzerinde geliştirilen playbooklar’ın temel rolleri ve detayları dökümante edilmektedir.
1.
Ansible 1.1 Base 1.2 Ansible 2.
Gitlab 2.1 Base 2.2 GitLab 3.
FirewallBuilder 3.1
Base 3.2
FirewallBuilder 4.
Rsyslog 4.1 Base 4.2
Rsyslog 5.
Testbuilder 5.1
Base 5.2
Firewall
7.
Maintenance 7.1
Maintenance 8.
Deploy 9.
State
Farklı görev üstlenen sunucular için farklı roller tanımlanmış olup her bir rolün yapısı aşağıda belirtilen şablon kullanılarak hazırlanmıştır.
Şablonun temel yapısında “roles/” klasörü altında bulunan alt klasörler gösterilmektedir:
- tasks/
- main.yml - task1.yml - task2.yml - defaults/
- vars/
- main.yml - templates/
- template1.j2 - template2.j2 - meta/
- README.md
Yukarıdaki klasör şablonuna göre her bir klasörün altında bulunan main.yml dosyası ana dosya olarak barınmakta ve içerisine belirtilen .yml dosyalarını playbook’a dahil etmektedir. Örnek vermek gerekirse, “tasks” dizini altındaki “main.yml” dosyası, “task1.yml” ve “task2.yml”
dosyalarını playbook’a dahil etmektedir.
<main.yml>
---
- include: task1.yml - include: task2.yml
Bu konsept dahilinde, her bir dizin o ansible rolüne ait farklı işlevliklere sahiptir. Bu işlevlerin
- Tasks: Herhangi bir görev, bu dizin altında belirtilir. (Örneğin: paket kurulumu, konfigurasyonu vb.)
- Vars: Ansible rollerine ait her bir değişken bu dizin altında belirtilir. (Örneğin:
kullanıcı id, kullanıcı adı, program hafıza boyutu vb.)
- Defaults: Tek defaya mahsus kullanılmak üzere ya da “vars” dizininde
belirtilmemiş değişkenler burada yer alır. Mevcut tasarımda bu klasör hiç bir rolde kullanılmamaktadır.
- Templates: Playbook çalıştığında sunucuda yapılması gereken, yapılandırma ayarları için oluşturulan temel dosyalardır. Bu şablonlar playbook’un
çalıştırılacağı sunucu üzerindeki konfigurasyon dosyaları yerlerine konularak konfigurasyon işlemi tamamlanacaktır.
- Handlers: Task’lerin “notify” kısımlarında belirtilen komutların dizin klasörüdür.
Bu task’lerde meydana gelecek bir değişiklikte notify kısmında belirtilen handlers’lar çağırılacaktır. Örneğin bir servisin konfigurasyonu değişmesi durumunda servisi yeniden başlatılma işlemini bu handlers’lar üstlenmektedir.
- Meta: Rollerin metadatalarını içerir. Bu metadatalarda ise paket bilgileri, bağımlılıklar gibi alanlar bulunmaktadır.
1. Ansible
Ahtapot projesi kapsamında merkezde bulunacak ve gitlab deposunu kullanarak sistem durumunu kararlı olarak ayakta tutacak merkezdeki komuta kontrol sunucusu üzerinde çalıştırılması gereken playbook’dur. “/etc/ansible/playbooks/” dizini altında bulunan
“ansible.yml” dosyasına bakıldığında, “hosts” satırında Ansible’a ait “/etc/ansible/” altında bulunan “hosts” dosyasında “[ansible]” satırı altına yazılmış tüm sunucularda bu playbookun oynatılacağı belirtilir. “remote_user” satırında, sistemler oynatılacak playbookun hangi kullanıcı ile oynatılacağı belirlenir. “sudo” satırı ile, çalışacak komutların sudo yetkisi ile çalışması
belirlenir. “roles” satırı altında bulunan satırlarda ise bu playbook çalıştığında “base” ve
“ansible” rollerinin çalışacağı belirtilmektedir.
$ more /etc/ansible/playbooks/ansible.yml
# Calistirildiginda Ansible Kurulumu Yapilir - hosts: ansible
remote_user: ahtapotops sudo: yes
roles:
- { role: base } - { role: ansible }
1.1 Base
Bu rol Ahtapot projesi kapsamındaki tüm sunucularda çalışan temel ayarlamaların yapıldığı roldür. Bu rolün görevleri:
- Tüm sistemlerde olması gereken paketlerin kurulum ve denetimleri:
- auditd,sysstat,ntp,bash,rsyslog,sudo
- Tüm sistemlerde bulunması gereken servislerin yapılandırılması:
- ntp, auditd, ssh
- Tüm sistemlerde yapılması gereken genel işlemler:
- sudo yapılandırma
- /etc/hosts yapılandırma - grub yapılandırma - rsyslog yapılandırma
- USB kullanım kapatma / açma
Bu roldeki değişkenler “/etc/ansible/roles/base/vars/main.yml” dosyasında belirtilmiştir.
“main.yml” dosyasının içeriği ve değişken bilgileri aşağıdaki gibidir;
- “group” fonksiyonunda sistemler üzerinde kullanılan kullanıcının ait olduğu grup bilgisi belirtilmektedir. “presentgroup” sistemde var olması gereken gruptur. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokedgroup” sistemden grubun silinmesini sağlar. Silinecek bir grup yok ise boş bırakılır.
group:
# Belirtilen grubun sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentgroup: ahtapotops
# Belirtilen grubun sunucudan silinmesini saglar.
revokedgroup:
- “user” fonksiyonunda sistemler üzerinde kullanılan kullanıcının bilgisi belirtilmektedir.
“presentuser” sistemde var olması gereken kullanıcıdır. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokeduser” sistemden kullanıcının silinmesini sağlar.
Silinecek bir kullanıcı yok ise boş bırakılır.
user:
# Belirtilen kullanicinin sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentuser: ahtapotops shell: /bin/bash
# Belirtilen kullanicinin sunucudan silinmesini saglar.
revokeduser:
- “packages” fonksiyonunda sistemler üzerine kurulacak paketler belirtilmektedir. “name”
satırında hangi paketlerin kurulacağı belirlenir. “updatecache” seçeneği ile “apt-get
update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller. “force” satırı ile kurulumun yapılması gerektiği durumlarda, her koşulda kurulumu tamamlamaya zorlar.
packages:
# Sisteme kurulacak paketleri belirler.
name: auditd,sysstat,ntp,bash,rsyslog,sudo updatecache: yes
state: present force: yes
- “repository” fonksiyonunda sistemlere eklenecek depo bilgileri verilmektedir. “repo”
satrında eklenecek deponun adresi belirtilmektedir. “url” satırında ihtiyaç olması
durumunda depo anahtarını belirtmek için kullanılılmaktadır. “updatecache” seçeneği ile
“apt-get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller.
repository:
# Ahtapot projesi kapsaminda olusturulan paketlerin bulundugu repo adresidir.
repo: 'deb http://193.140.98.199/pardus-yenikusak pardus-ahtapot main'
# Pardus tarafından herhangi bir rep key ulasmadigindan dolayi kapatildi.
# url: 'http://ip_adres/packages/amd64/bilgio.asc' updatecache: yes
state: present
- “sudo” fonksiyonunda sudo yapılandırması yapılmaktadır. “source” satırında belirtilen ve “/etc/ansible/roles/base/templates” altında bulunan “sudoers.j2” dosyasında bulunan ayarları sunucular üzerinde gerçekleştirir. “destination” satırında ayarların
olan kullanıcı, grup ve hakları belirlenir. “iologdir” satırı ile sudo loglarının hangi dizine yazılacağı belirtilir. “group” ile hangi grup için bu ayarların yapılacağı belirtilir.
“newgroup” satırı, grupta bir değişlik olacağı durumlarda buraya yazılarak, değişikliğin sağlanmasına yaramaktadır. Grup değişmeyeceği sürece güncel grup adı ile kalmalıdır.
“commands” satırı ile ilgili grupa hangi komutlar için yetki verileceği belirtilmektedir.
“firewall” alt fonksiyonu ile Limitlik Kullanıcı Konsolunda kullanılacak kullanıcıya gerekli yetki verilir.
sudo:
# Sudo yapilandirmasini belirtmektedir.
conf:
source: sudoers.j2
destination: /etc/sudoers owner: root
group: root mode: 440
iologdir: "/var/log/sudo-io/%{hostname}/%{user}"
group: ahtapotops newgroup: ahtapotops commands: ALL
firewall:
user: lkk
commands: /usr/sbin/iptraf
- “usb-storage” fonksiyonunda sistemlerdeki usb kapılarının açılıp/kapanması sağlanır.
“/etc/ansible/roles/base/templates” dizini altında bulunan “blacklist.conf.j2”
dosyasındaki izin verilmeyecek durumları modprobe’a yazar.
usb-storage:
# usb yapilandirmasini belirtmektedir.
conf:
source: blacklist.conf.j2
destination: /etc/modprobe.d/blacklist.conf owner: root
group: root
mode: 644
- “logger” fonksiyonu ile sistemlerin ayakta ve log gönderebilir olduğunun kontrolünün yapılacağı script “/etc/ansible/roles/base/templates” dizini altında bulunan
“logger.sh.j2” dosyasından kopyalanarak cron’a eklenmektedir.
logger:
# heartbeat yapilandirmasini belirtmektedir.
cron:
source: logger.sh.j2
destination: /etc/cron.d/logger.sh owner: root
group: root mode: 755 min: "00"
hour: "*"
facility: local5 severity: info tag: "heartbeat"
message: "Heartbeat from $(hostname) at $(date) !"
- “ssh” fonksiyonunda sistemlerde ssh tanımlamaları, yapılandırma ve sıkılaştırma işlemleri yapılır. “conf” alt fonksiyonu ile “/etc/ssh/sshd_config” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda ssh servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “TrustedUserCAKeys” alt fonksiyonu ile sisteme eklenen CA imzalı açık anahtar bilgisi, bu anahtarın hakları ve erişim yetkileri belirlenir.
“LocalBanner” ve “RemoteBanner” alt fonksiyonları ile sunuculara bağlantı
kurulduğunda ekrana gelecek uyarı belirtilir. Bu satırlardan sonra gelen satırlarda, ssh yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/ssh/sshd_config” dosyasına bu değişiklikler yansıtılacaktır. Sistemlerde
kullanılacak ssh portunu varsıyan “22” değeri dışında başka bir değere atamak istenir ise, “Port” satırındaki 22 değeri olması istenen değer ile değiştirilmelidir.
ssh:
# ssh yapilandirmasini belirtmektedir.
conf:
source: sshd_config.j2
destination: /etc/ssh/sshd_config owner: root
group: root mode: 0644 service:
name: ssh state: started enabled: yes TrustedUserCAKeys:
source: ahtapot_ca.pub.j2
destination: /etc/ssh/ahtapot_ca.pub owner: root
group: root mode: 0644 LocalBanner:
source: issue.j2
destination: /etc/issue owner: root
group: root mode: 0644 RemoteBanner:
source: issue.net.j2
destination: /etc/issue.net owner: root
group: root mode: 0644 Port: 22 Protocol: 2
ListenAddressv4: 0.0.0.0 ListenAddressv6: "::"
UsePrivilegeSeparation: "yes"
ServerKeyBits: 1024 SyslogFacility: AUTH LogLevel: INFO LoginGraceTime: 90 PermitRootLogin: "no"
StrictModes: "yes"
RSAAuthentication: "yes"
PubkeyAuthentication: "yes"
IgnoreRhosts: "yes"
RhostsRSAAuthentication: "no"
HostbasedAuthentication: "no"
IgnoreUserKnownHosts: "yes"
PermitEmptyPasswords: "no"
ChallengeResponseAuthentication: "no"
PasswordAuthentication: "no"
KerberosAuthentication: "no"
KerberosOrLocalPasswd: "yes"
KerberosTicketCleanup: "yes"
GSSAPIAuthentication: "no"
GSSAPICleanupCredentials: "yes"
X11Forwarding: "no"
X11DisplayOffset: 10 PrintMotd: "yes"
PrintLastLog: "yes"
TCPKeepAlive: "yes"
UsePAM: "no"
UseLogin: "no"
- “ntp” fonksiyonunda sistemlerdeki ntp yapılandırması yapılmaktadır. “conf” alt
fonksiyonu ile “/etc/ntp.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service”
alt fonksiyonunda ntp servisinin değişikliklerden sonra yeniden başlatılması sağlanır.
“FirstNtpServerHost” satırına ilk NTP sunucusunun adı ve ya ip adresi girilir.
“SecondNtpServerHost” satırına ikinci NTP sunucusunun adı ve ya ip adresi girilir.
İkinci NTP sunucusu olmaması durumunda bu satırın başına “#” işareti konularak kullanım dışı kalması sağlanır.
ntp:
# ntp yapilandirmasini belirtmektedir.
conf:
source: ntp.conf.j2
destination: /etc/ntp.conf owner: root
group: root mode: 0644 service:
name: ntp state: started enabled: yes
# ntp server bilgileri girilmektedir.
FirstNtpServerHost: "0.debian.pool.ntp.org"
SecondNtpServerHost: "1.debian.pool.ntp.org"
- “hosts” fonksiyonunda “source” satırında belirtilen ve
“/etc/ansible/roles/base/templates” altında bulunan “hosts.j2” dosyanında yer alan host bilgilerini çalıştığı tüm makinalarda “/etc/hosts” dizini altına atmaktadır. Akabinde bu dosyanın hakları ve erişim yetkileri belirlenir.
hosts:
# /etc/hosts yapilandirmasini belirtmektedir.
conf:
source: hosts.j2
destination: /etc/hosts
owner: root group: root mode: 0644
- “grub” fonksiyonunda sunucularda grub parolası belirlenir. “conf” alt fonksiyonu ile kullanıcı/parola bilgileri girilir ve bu dosyanın hakları ve erişim yetkileri belirlenir. “conf2”
alt fonksiyonu ile ise girdiler belirlenir ve bu dosyanın hakları ve erişim yetkileri belirlenir.
“confile” ile dosya dizini belirtilir. “grubuser” ile kullanıcı bilgisi, “grubpass” ile parola bilgisi girilir.
grub:
# grub yapilandirmasini belirtmektedir.
conf:
source: grub_01_users.j2
destination: /etc/grub.d/01_users owner: root
group: root mode: 755 conf2:
source: grub_10_linux.j2
destination: /etc/grub.d/10_linux owner: root
group: root mode: 755
confile: "/boot/grub/grub.cfg"
grubuser: ahtagrub grubpass:
grub.pbkdf2.sha512.10000.2A82B914C527C90A5018614B88F1604955C46131AEF358D1CB8 1E604793F5DD973DC3B796A2AF691AECC835928F76774835920D11B7FBEB07F050FAAF231B75 4.9433A4A373F5FB7D5FC05E25E14CAC0FEAD7FDE2019BE0E5E5D3B7D98A06FA3DB018D3EC7A 0557B1D7BCDB3AD091B8C44E121B057931E72A0A1592A7392214DF
- “audit” fonksiyonunda sunucularda audit yapılandırmasının yapılamasını sağlamaktadır.
“conf” alt fonksiyonu ile “/etc/audit/auditd.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda audit servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “rules” alt fonksiyonunda “/etc/audit/audit.rules” dosyasının
hakları ve erişim yetkileri belirlenir. Bu satırlardan sonra gelen satırlarda, audit yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/audit/auditd.conf” dosyasına bu değişiklikler yansıtılacaktır.
audit:
# audit yapilandirmasini belirtmektedir.
conf:
source: auditd.conf.j2
destination: /etc/audit/auditd.conf owner: root
group: root mode: 0644 service:
name: auditd state: started enabled: yes rules:
source: audit.rules.j2
destination: /etc/audit/audit.rules owner: root
group: root mode: 0644 name: "ahtapotops"
name_format: "user"
log_file: /var/log/audit/audit.log log_format: RAW
log_group: "root"
max_log_file: 10
max_log_file_action: ROTATE num_logs: 5
priority_boost: 4 flush: INCREMENTAL freq: 20
disp_qos: lossy
dispatcher: /sbin/audispd space_left: 2000
space_left_action: SYSLOG action_mail_acct: "root"
admin_space_left: 1000
admin_space_left_action: SUSPEND
disk_full_action: SUSPEND disk_error_action: SUSPEND tcp_listen_queue: 5
tcp_max_per_addr: 1
tcp_client_ports: 1024-65535 tcp_client_max_idle: 0 enable_krb5: "no"
krb5_principal: auditd
krb5_key_file: /etc/audit/audit.key
- “sysctl” fonksiyonunda sunucular üzerinde sysctl yapılandırması yapılmaktadır. “conf”
alt fonksiyonu ile “/etc/sysctl.conf” dosyasına “/etc/ansible/roles/base/templates/”
altında bulunan “sysctl.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
Bu satırlardan sonra gelen satırlarda, sysctl yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/sysctl.conf” dosyasına bu değişiklikler yansıtılacaktır.
sysctl:
# sysctl yapilandirmasini belirtmektedir.
conf:
source: sysctl.conf.j2
destination: /etc/sysctl.conf owner: root
group: root mode: 0644
icmp_ignore_bougs_error_responses: 1 icmp_echo_ignore_broadcasts: 1
- “rsyslog” fonksiyonunda sunucularda rsyslog yapılandırmasının yapılamasını sağlamaktadır. “conf” alt fonksiyonu ile “/etc/rsyslog.conf” dosyasına
“/etc/ansible/roles/base/templates/” altında bulunan “rsyslog.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir. “service” alt fonksiyonunda rsyslog servisinin değişikliklerden sonra yeniden başlatılması sağlanır. Bu satırlardan sonra gelen satırlarda, rsyslog yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/rsyslog.conf” dosyasına bu değişiklikler yansıtılacaktır. “Server1” ve
rsyslog sunucusu bulunmadığı durumlarda “Server2” satırı başına “#” konularak kullanım dışı haline getirilmelidir.
rsyslog:
# rsyslog yapilandirmasini belirtmektedir.
conf:
source: rsyslog.conf.j2
destination: /etc/rsyslog.conf owner: root
group: root mode: 0644 service:
name: rsyslog state: started enabled: yes ConnectionType: tcp
Server1: rsyslog01.gdys.local #Server2: rsyslog02.gdys.local Port: 514
ActionQueueMaxDiskSpace: 1g ActionQueueSaveOnShutdown: on ActionQueueType: LinkedList ActionResumeRetryCount: -1
WorkDirectory: "/var/spool/rsyslog"
IncludeConfig: "/etc/rsyslog.d/*"
1.2 Ansible
Bu rol Ahtapot projesi kapsamındaki Ansible görevini üstlenecek sunucularda çalıştırılan Ansible ayarlamaların yapıldığı roldür. Bu rolün görevleri:
- Ansible sunucusu üzerinde bulunması gereken paketlerin kurulum ve denetimleri:
- git,ansible, python-requests, ahtapot-gkts, rsync - Ansible sunucusu yapılması gereken genel işlemler:
- Ansible’da çalışalıcak dizin ve alt dizinlerin oluşturulması
- Merkezi Sürüm Takip Sistemi’nde bulunan mys deposunun yerele indirilmesi
- Güvenlik Duvarı Yönetim Sistemi’nde bulunan gdys deposunun yerele indirilmesi Bu roldeki değişkenler “/etc/ansible/roles/ansible/vars/main.yml” dosyasında belirtilmiştir.
“main.yml” dosyasının içeriği ve değişken bilgileri aşağıdaki gibidir;
- “packages” fonksiyonunda Ansible sunucusu üzerine kurulacak paketler belirtilmektedir.
“name” satırında hangi paketlerin kurulacağı belirlenir. “updatecache” seçeneği ile “apt- get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller. “force” satırı ile kurulumun yapılması gerektiği durumlarda, her koşulda kurulumu tamamlamaya zorlar. “packages-latest” fonksiyonunda “name”
satırında yazan paket isimlerinin her zaman son versiyonlarının sistemde olup olmadığı kontrol edilir. Ve olmaması durumunda güncellenir.
packages:
# Sisteme kurulacak paketleri belirler.
name: git,ansible,python-requests,rsync updatecache: yes
state: present force: yes packages-latest:
name: ahtapot-gkts updatecache: yes state: latest force: yes
- “git” fonksiyonunda Ansible sunucusunda bulunacak git depolarının bilgileri girilmektedir.
Bu fonksiyon altında Ansible sunucusunun erişmesi gereken “gdys” ve “mys” git depolarının bilgileri bulunmaktadır. Her iki alt fonksiyonun da çalışma prensibi aynıdır.
“repo” satırına MYS kapsamında kurulmuş Yerel GitLab sunucusunda bulunan ilgili depo adresi girilir. “update” satırı ile her işlem öncesinde “git pull” komutu çalıştırarak
deponun güncel halinin çekilmesi sağlanır. “accepthostkey” satırında bağlantı sırasında sunucu anahtarını kabul edilip edilmeyeceğine dair soru geldiğinde kabul etmesine zorlamaktadır. “destination” alt fonksiyonu ile GitLab deposunun kopyalanacağı dizin ve
bu dizinin hakları, erişim yetkileri belirtilmektedir. “keyfile” satırı ile GitLab’a erişecek kullanıcının anahtar bilgisi girilmektedir.
git:
# Onay mekanizmasinda kullanilan GitLab bilgileri belirtilmektedir.
gdys:
# Onay mekanizmasinin bulundugu Yerel GitLab reposu belirtilmektedir.
repo: ssh://git@ip_adres:ssh_port/ahtapotops/gdys.git update: yes
accepthostkey: yes
# Onay mekanizmasinina ait GitLab reposunun kopyalanacagi dizin belirtilmektedir.
destination:
path: /etc/fw/gdys group: ahtapotops owner: ahtapotops mode: 750
state: directory recurse: yes
# Onay mekanizmasinda Yerel GitLab' in kullanacagi kullanici anahtari belirtilmektedir.
keyfile: /home/ahtapotops/.ssh/id_rsa mys:
# MYS mekanizmasinin bulundugu Yerel GitLab reposu belirtilmektedir.
repo: ssh://git@ip_adres:ssh_port/ahtapotops/mys.git update: yes
accepthostkey: yes
# MYS reposunun kopyalanacagi dizin belirtilmektedir.
destination:
path: /etc/ansible/
group: ahtapotops owner: ahtapotops mode: 750
state: directory recurse: yes
# MYS Yerel GitLab' in kullanacagi kullanici anahtari belirtilmektedir.
keyfile: /home/ahtapotops/.ssh/id_rsa
- “deployer” fonksiyonu ile, “/etc/ansible/roles/ansible/templates” dizini altında bulunan
“mys.sh.j2” ve “gdys.sh.j2” scriptleri ile, Ansible makinası üzerinde bulunan GDYS ve MYS repolarının GitLab’dan güncel hallerinin çekilmesi sağlanır.
deployer:
mys:
source: mys.sh.j2
destination: /usr/bin/mys.sh owner: root
group: root mode: 755 gdys:
source: gdys.sh.j2
destination: /usr/bin/gdys.sh owner: root
group: root mode: 755
2. Gitlab
Ahtapot projesi kapsamında merkezde bulunacak ve sistemlerin ihtiyaç duyduğu dosyaları depolarından bulunduran GitLab sunucunu kuracak playbook’dur. “/etc/ansible/playbooks/”
dizini altında bulunan “gitlab.yml” dosyasına bakıldığında, “hosts” satırında Ansible’a ait
“/etc/ansible/” altında bulunan “hosts” dosyasında “[gitlab]” satırı altına yazılmış tüm sunucularda bu playbookun oynatılacağı belirtilir. “remote_user” satırında, sistemler oynatılacak playbookun hangi kullanıcı ile oynatılacağı belirlenir. “sudo” satırı ile, çalışacak komutların sudo yetkisi ile çalışması belirlenir. “roles” satırı altında bulunan satırlarda ise bu playbook çalıştığında “base” ve “gitlab” rollerinin çalışacağı belirtilmektedir. Ayrıca bu playbook ile Ansible rolünde çalışan sunuculara ait “ansible” rolü de çalıştırılır. Böylelikle GitLab tarafında yapılan her değişiklikte, Ansible makinası üzerindeki git depoları güncellenmiş olur.
$ more /etc/ansible/playbooks/gitlab.yml
# Calistirildiginda Gitlab Kurulumu Yapilir - hosts: ansible
remote_user: ahtapotops sudo: yes
roles:
- { role: base } - { role: ansible } - hosts: gitlab
remote_user: ahtapotops sudo: yes
roles:
- { role: base } - { role: gitlab }
2.1 Base
Bu rol Ahtapot projesi kapsamındaki tüm sunucularda çalışan temel ayarlamaların yapıldığı roldür. Bu rolün görevleri:
- Tüm sistemlerde olması gereken paketlerin kurulum ve denetimleri:
- auditd,sysstat,ntp,bash,rsyslog,sudo
- Tüm sistemlerde bulunması gereken servislerin yapılandırılması:
- ntp, auditd, ssh
- Tüm sistemlerde yapılması gereken genel işlemler:
- sudo yapılandırma - sysctl yapılandırma - /etc/hosts yapılandırma - grub yapılandırma - rsyslog yapılandırma
- USB kullanım kapatma / açma
Bu roldeki değişkenler “/etc/ansible/roles/base/vars/main.yml” dosyasında belirtilmiştir.
“main.yml” dosyasının içeriği ve değişken bilgileri aşağıdaki gibidir;
- “group” fonksiyonunda sistemler üzerinde kullanılan kullanıcının ait olduğu grup bilgisi belirtilmektedir. “presentgroup” sistemde var olması gereken gruptur. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokedgroup” sistemden grubun silinmesini sağlar. Silinecek bir grup yok ise boş bırakılır.
group:
# Belirtilen grubun sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentgroup: ahtapotops
# Belirtilen grubun sunucudan silinmesini saglar.
revokedgroup:
- “user” fonksiyonunda sistemler üzerinde kullanılan kullanıcının bilgisi belirtilmektedir.
“presentuser” sistemde var olması gereken kullanıcıdır. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokeduser” sistemden kullanıcının silinmesini sağlar.
Silinecek bir kullanıcı yok ise boş bırakılır.
user:
# Belirtilen kullanicinin sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentuser: ahtapotops shell: /bin/bash
# Belirtilen kullanicinin sunucudan silinmesini saglar.
revokeduser:
- “packages” fonksiyonunda sistemler üzerine kurulacak paketler belirtilmektedir. “name”
satırında hangi paketlerin kurulacağı belirlenir. “updatecache” seçeneği ile “apt-get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller. “force” satırı ile kurulumun yapılması gerektiği durumlarda, her koşulda kurulumu tamamlamaya zorlar.
packages:
# Sisteme kurulacak paketleri belirler.
name: auditd,sysstat,ntp,bash,rsyslog,sudo updatecache: yes
state: present force: yes
- “repository” fonksiyonunda sistemlere eklenecek depo bilgileri verilmektedir. “repo”
satrında eklenecek deponun adresi belirtilmektedir. “url” satırında ihtiyaç olması
durumunda depo anahtarını belirtmek için kullanılılmaktadır. “updatecache” seçeneği ile
“apt-get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller.
repository:
# Ahtapot projesi kapsaminda olusturulan paketlerin bulundugu repo adresidir.
repo: 'deb http://193.140.98.199/pardus-yenikusak pardus-ahtapot main'
# Pardus tarafından herhangi bir rep key ulasmadigindan dolayi kapatildi.
# url: 'http://ip_adres/packages/amd64/bilgio.asc' updatecache: yes
state: present
- “sudo” fonksiyonunda sudo yapılandırması yapılmaktadır. “source” satırında belirtilen ve “/etc/ansible/roles/base/templates” altında bulunan “sudoers.j2” dosyasında bulunan ayarları sunucular üzerinde gerçekleştirir. “destination” satırında ayarların yapılacağı sudoers dosyası belirlenir. “owner”, “group” ve “mode” ile bu dosyanın sahibi olan kullanıcı, grup ve hakları belirlenir. “iologdir” satırı ile sudo loglarının hangi dizine yazılacağı belirtilir. “group” ile hangi grup için bu ayarların yapılacağı belirtilir.
“newgroup” satırı, grupta bir değişlik olacağı durumlarda buraya yazılarak, değişikliğin sağlanmasına yaramaktadır. Grup değişmeyeceği sürece güncel grup adı ile kalmalıdır.
“firewall” alt fonksiyonu ile Limitlik Kullanıcı Konsolunda kullanılacak kullanıcıya gerekli yetki verilir.
sudo:
# Sudo yapilandirmasini belirtmektedir.
conf:
source: sudoers.j2
destination: /etc/sudoers owner: root
group: root mode: 440
iologdir: "/var/log/sudo-io/%{hostname}/%{user}"
group: ahtapotops newgroup: ahtapotops commands: ALL
firewall:
user: lkk
commands: /usr/sbin/iptraf
- “usb-storage” fonksiyonunda sistemlerdeki usb kapılarının açılıp/kapanması sağlanır.
“/etc/ansible/roles/base/templates” dizini altında bulunan “blacklist.conf.j2”
dosyasındaki izin verilmeyecek durumları modprobe’a yazar.
usb-storage:
# usb yapilandirmasini belirtmektedir.
conf:
source: blacklist.conf.j2
destination: /etc/modprobe.d/blacklist.conf owner: root
group: root mode: 644
- “logger” fonksiyonu ile sistemlerin ayakta ve log gönderebilir olduğunun kontrolünün yapılacağı script “/etc/ansible/roles/base/templates” dizini altında bulunan
“logger.sh.j2” dosyasından kopyalanarak cron’a eklenmektedir.
logger:
# heartbeat yapilandirmasini belirtmektedir.
cron:
source: logger.sh.j2
destination: /etc/cron.d/logger.sh owner: root
group: root mode: 755 min: "00"
hour: "*"
facility: local5 severity: info tag: "heartbeat"
message: "Heartbeat from $(hostname) at $(date) !"
- “ssh” fonksiyonunda sistemlerde ssh tanımlamaları, yapılandırma ve sıkılaştırma işlemleri yapılır. “conf” alt fonksiyonu ile “/etc/ssh/sshd_config” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda ssh servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “TrustedUserCAKeys” alt fonksiyonu ile sisteme eklenen CA imzalı açık anahtar bilgisi, bu anahtarın hakları ve erişim yetkileri belirlenir.
“LocalBanner” ve “RemoteBanner” alt fonksiyonları ile sunuculara bağlantı
kurulduğunda ekrana gelecek uyarı belirtilir. Bu satırlardan sonra gelen satırlarda, ssh yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/ssh/sshd_config” dosyasına bu değişiklikler yansıtılacaktır. Sistemlerde
kullanılacak ssh portunu varsıyan “22” değeri dışında başka bir değere atamak istenir ise, “Port” satırındaki 22 değeri olması istenen değer ile değiştirilmelidir.
ssh:
# ssh yapilandirmasini belirtmektedir.
conf:
source: sshd_config.j2
destination: /etc/ssh/sshd_config owner: root
group: root mode: 0644 service:
name: ssh state: started enabled: yes TrustedUserCAKeys:
source: ahtapot_ca.pub.j2
destination: /etc/ssh/ahtapot_ca.pub owner: root
group: root mode: 0644 LocalBanner:
source: issue.j2
destination: /etc/issue owner: root
group: root mode: 0644 RemoteBanner:
source: issue.net.j2
destination: /etc/issue.net owner: root
group: root mode: 0644 Port: 22 Protocol: 2
ListenAddressv4: 0.0.0.0 ListenAddressv6: "::"
UsePrivilegeSeparation: "yes"
KeyRegenerationInterval: 3600
ServerKeyBits: 1024 SyslogFacility: AUTH LogLevel: INFO LoginGraceTime: 90 PermitRootLogin: "no"
StrictModes: "yes"
RSAAuthentication: "yes"
PubkeyAuthentication: "yes"
IgnoreRhosts: "yes"
RhostsRSAAuthentication: "no"
HostbasedAuthentication: "no"
IgnoreUserKnownHosts: "yes"
PermitEmptyPasswords: "no"
ChallengeResponseAuthentication: "no"
PasswordAuthentication: "no"
KerberosAuthentication: "no"
KerberosOrLocalPasswd: "yes"
KerberosTicketCleanup: "yes"
GSSAPIAuthentication: "no"
GSSAPICleanupCredentials: "yes"
X11Forwarding: "no"
X11DisplayOffset: 10 PrintMotd: "yes"
PrintLastLog: "yes"
TCPKeepAlive: "yes"
UsePAM: "no"
UseLogin: "no"
- “ntp” fonksiyonunda sistemlerdeki ntp yapılandırması yapılmaktadır. “conf” alt
fonksiyonu ile “/etc/ntp.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service”
alt fonksiyonunda ntp servisinin değişikliklerden sonra yeniden başlatılması sağlanır.
“FirstNtpServerHost” satırına ilk NTP sunucusunun adı ve ya ip adresi girilir.
“SecondNtpServerHost” satırına ikinci NTP sunucusunun adı ve ya ip adresi girilir.
İkinci NTP sunucusu olmaması durumunda bu satırın başına “#” işareti konularak kullanım dışı kalması sağlanır.
ntp:
# ntp yapilandirmasini belirtmektedir.
conf:
source: ntp.conf.j2
destination: /etc/ntp.conf owner: root
group: root mode: 0644 service:
name: ntp state: started enabled: yes
# ntp server bilgileri girilmektedir.
FirstNtpServerHost: "0.debian.pool.ntp.org"
SecondNtpServerHost: "1.debian.pool.ntp.org"
- “hosts” fonksiyonunda “source” satırında belirtilen ve
“/etc/ansible/roles/base/templates” altında bulunan “hosts.j2” dosyanında yer alan host bilgilerini çalıştığı tüm makinalarda “/etc/hosts” dizini altına atmaktadır. Akabinde bu dosyanın hakları ve erişim yetkileri belirlenir.
hosts:
# /etc/hosts yapilandirmasini belirtmektedir.
conf:
source: hosts.j2
destination: /etc/hosts owner: root
group: root mode: 0644
- “grub” fonksiyonunda sunucularda grub parolası belirlenir. “conf” alt fonksiyonu ile kullanıcı/parola bilgileri girilir ve bu dosyanın hakları ve erişim yetkileri belirlenir. “conf2”
alt fonksiyonu ile ise girdiler belirlenir ve bu dosyanın hakları ve erişim yetkileri belirlenir.
“confile” ile dosya dizini belirtilir. “grubuser” ile kullanıcı bilgisi, “grubpass” ile parola bilgisi girilir.
grub:
# grub yapilandirmasini belirtmektedir.
conf:
source: grub_01_users.j2
destination: /etc/grub.d/01_users owner: root
group: root mode: 755 conf2:
source: grub_10_linux.j2
destination: /etc/grub.d/10_linux owner: root
group: root mode: 755
confile: "/boot/grub/grub.cfg"
grubuser: ahtagrub grubpass:
grub.pbkdf2.sha512.10000.2A82B914C527C90A5018614B88F1604955C46131AEF358D1CB8 1E604793F5DD973DC3B796A2AF691AECC835928F76774835920D11B7FBEB07F050FAAF231B75 4.9433A4A373F5FB7D5FC05E25E14CAC0FEAD7FDE2019BE0E5E5D3B7D98A06FA3DB018D3EC7A 0557B1D7BCDB3AD091B8C44E121B057931E72A0A1592A7392214DF
- “audit” fonksiyonunda sunucularda audit yapılandırmasının yapılamasını sağlamaktadır.
“conf” alt fonksiyonu ile “/etc/audit/auditd.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda audit servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “rules” alt fonksiyonunda “/etc/audit/audit.rules” dosyasının hakları ve erişim yetkileri belirlenir. Bu satırlardan sonra gelen satırlarda, audit yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/audit/auditd.conf” dosyasına bu değişiklikler yansıtılacaktır.
audit:
# audit yapilandirmasini belirtmektedir.
conf:
source: auditd.conf.j2
destination: /etc/audit/auditd.conf owner: root
group: root mode: 0644 service:
name: auditd state: started enabled: yes rules:
source: audit.rules.j2
destination: /etc/audit/audit.rules owner: root
group: root mode: 0644 name: "ahtapotops"
name_format: "user"
log_file: /var/log/audit/audit.log log_format: RAW
log_group: "root"
max_log_file: 10
max_log_file_action: ROTATE num_logs: 5
priority_boost: 4 flush: INCREMENTAL freq: 20
disp_qos: lossy
dispatcher: /sbin/audispd space_left: 2000
space_left_action: SYSLOG action_mail_acct: "root"
admin_space_left: 1000
admin_space_left_action: SUSPEND
disk_full_action: SUSPEND disk_error_action: SUSPEND tcp_listen_queue: 5
tcp_max_per_addr: 1
tcp_client_ports: 1024-65535 tcp_client_max_idle: 0 enable_krb5: "no"
krb5_principal: auditd
krb5_key_file: /etc/audit/audit.key
- “sysctl” fonksiyonunda sunucular üzerinde sysctl yapılandırması yapılmaktadır. “conf”
alt fonksiyonu ile “/etc/sysctl.conf” dosyasına “/etc/ansible/roles/base/templates/”
altında bulunan “sysctl.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
Bu satırlardan sonra gelen satırlarda, sysctl yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/sysctl.conf” dosyasına bu değişiklikler yansıtılacaktır.
sysctl:
# sysctl yapilandirmasini belirtmektedir.
conf:
source: sysctl.conf.j2
destination: /etc/sysctl.conf owner: root
group: root mode: 0644
icmp_ignore_bougs_error_responses: 1 icmp_echo_ignore_broadcasts: 1
- “rsyslog” fonksiyonunda sunucularda rsyslog yapılandırmasının yapılamasını sağlamaktadır. “conf” alt fonksiyonu ile “/etc/rsyslog.conf” dosyasına
“/etc/ansible/roles/base/templates/” altında bulunan “rsyslog.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir. “service” alt fonksiyonunda rsyslog servisinin değişikliklerden sonra yeniden başlatılması sağlanır. Bu satırlardan sonra gelen satırlarda, rsyslog yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/rsyslog.conf” dosyasına bu değişiklikler yansıtılacaktır. “Server1” ve
rsyslog sunucusu bulunmadığı durumlarda “Server2” satırı başına “#” konularak kullanım dışı haline getirilmelidir.
rsyslog:
# rsyslog yapilandirmasini belirtmektedir.
conf:
source: rsyslog.conf.j2
destination: /etc/rsyslog.conf owner: root
group: root mode: 0644 service:
name: rsyslog state: started enabled: yes ConnectionType: tcp
Server1: rsyslog01.gdys.local #Server2: rsyslog02.gdys.local Port: 514
ActionQueueMaxDiskSpace: 1g ActionQueueSaveOnShutdown: on ActionQueueType: LinkedList ActionResumeRetryCount: -1
WorkDirectory: "/var/spool/rsyslog"
IncludeConfig: "/etc/rsyslog.d/*"
2.2 GitLab
Bu rol Ahtapot projesi kapsamındaki GitLab rolünü üstlenecek sunucularda ayarlamaların yapıldığı roldür. Bu rolün görevleri:
- GitLab sunucusu üzerinde bulunması gereken paketlerin kurulum ve denetimleri:
- git,gitlab-ce
- GitLab sunucusu yapılması gereken genel işlemler:
- git kullanıcısının yapılandırılması - GitLab SSL yapılandırması - GitLab SMTP yapılandırması - GitLab yedeklilik yapılandırması
Bu roldeki değişkenler “/etc/ansible/roles/gitlab/vars/main.yml” dosyasında belirtilmiştir.
“main.yml” dosyasının içeriği ve değişken bilgileri aşağıdaki gibidir;
- “gitlab” fonksiyonunda sunucu üzerindeki git kullanıcısına parola atanmaktadır. Her ne kadar SSH ile parolasız bağlantı sağlansa da, git kullanıcısının parolası olması
gerekmektedir.
gitlab:
# git kullanicisini yapilandirmasi belirtilmektedir.
user:
name: git password:
"jQCGY1Gp$rVz8u3qRyH3UCB.6MSnWToQv1qQYjYeatbBEA0pA4aqnjoTchjPDsm9CAeuk1xVKoV 3MqM1C/UJZ6Fgap9XmB0"
state: present
- “packages” fonksiyonunda GitLab sunucusu üzerine kurulacak paketler belirtilmektedir.
“name” satırında hangi paketlerin kurulacağı belirlenir. “updatecache” seçeneği ile “apt- get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller. “force” satırı ile kurulumun yapılması gerektiği durumlarda, her koşulda kurulumu tamamlamaya zorlar.
packages:
# GitLab playbooku ile kurulacak paketleri belirtmektedir.
name: git,gitlab-ce updatecache: yes
force: yes
- “conf” fonksiyonu ile “/etc/gitlab/gitlab.rb” dosyasına
“/etc/ansible/roles/gitlab/templates/” altında bulunan “gitlab.rb.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
conf:
source: gitlab.rb.j2
destination: /etc/gitlab/gitlab.rb owner: root
group: root mode: 0640
- “ssl” fonksiyonu ile “/etc/gitlab/ssl” dosyasının hakları, erişim yetkileri belirlenir.
ssl:
directory:
path: /etc/gitlab/ssl owner: root
group: root mode: 700
state: directory recurse: yes
- “ssl-crt” fonksiyonu ile “/etc/gitlab/ssl/gitlab_makina_ismi.crt” dosyasına
“/etc/ansible/roles/gitlab/templates/” altında bulunan “ssl-crt.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
ssl-crt:
source: ssl-crt.j2
destination: /etc/gitlab/ssl/gitlab_makina_ismi.crt owner: root
group: root mode: 600
- “ssl-key” fonksiyonu ile “/etc/gitlab/ssl/gitlab_makina_ismi.key” dosyasına
“/etc/ansible/roles/gitlab/templates/” altında bulunan “ssl-key.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
ssl-key:
source: ssl-key.j2
destination: /etc/gitlab/gitlab_makina_ismi.key owner: root
group: root mode: 600
- “external_url” fonksiyonu ile GitLab arayüzüne ulaşması istenilen URL adresi yazılır.
“firstrunpath” de belirtilen, GitLab’ ın ilk yapılandırmasında adres bilgileri bu dosyaya yazılır.
external_url: https://URL_Adresi
firstrunpath: /var/opt/gitlab/bootstrapped
- “gitlab_rails” fonksiyonu ile GitLab sunucusunun bilgilendirme ayarları yapılmaktadır.
“gitlab_email_from:” satırına GitLab tarafından atılacak bilgilendirme postalarının hangi adres tarafından atılacağı belirtilmelidir. “gitlab_email_display_name:” satırında gönderilen postalarda görünmesi istenilen isim belirlenir. “gitlab_email_reply_to:”
satırında GitLab tarafından gönderilen postalara cevap verilmesi durumunda cevabın hangi adrese yönlendirilmesi istendiği belirtilir. “smtp_address:” satırında smtp sunucusunun FQDN ve ya IP adres bilgileri girilir. “smtp_port:” satırında smtp
sunucusunun kullandığı port yazılır. “smtp_domain:” satırında ise stmp alan adı bilgisi girilir.
gitlab_rails:
gitlab_email_enabled: "true"
gitlab_email_from: gitlab@domain_adres gitlab_email_display_name: Gitlab
gitlab_email_reply_to: no-reply@domain_adres gitlab_default_theme: 2
gitlab_shell_ssh_port: SSH_port smtp_enable: "true"
smtp_address: smtp_adres smtp_port: 25
smtp_domain: domain_adres smtp_tls: "false"
- “nginx” fonksiyonu ile GitLab arayüzüne erişin adres çubuğunda “http” ile istek yapıldığında bağlantıyı otomatize bir şekilde “https” bağlantısına çevirmesi sağlanır.
nginx:
enable: "true"
redirect_http_to_https: "true"
- “backup” fonksiyonu ile GitLab sunucusu üzerinde bulunan her bir deponun yedeğini alarak, yedek GitLab sunucusuna dönülmesini sağlamaktadır. Bu işlem GitLab’ ın sağladığı “custom hook” yapısı ile sağlanmaktadır. “source” satırında belirtilen
“/etc/ansible/roles/gitlab/templates” altında bulunan “post-receive.sh.j2” dosyasının içeriğini “destination” satırlarında belirtilen tüm dizinlere kopyalanır ve hakları, erişim yetkileri belirlenir. “Server” satırına yedek GitLab sunucusunun FQDN ve ya IP adres bilgisi girilir. “Port” satırında sunucusunun ssh port bilgisi bildirilir. “ansible”
fonksiyonunun altında bulunan “Server” satırına yedek GitLab sunucusunun FQDN ve ya IP adres bilgisi girilir. “Port” satırında sunucusunun ssh port bilgisi bildirilir.
backup:
conf:
source: post-receive.sh.j2
destination1: /var/opt/gitlab/git-
data/repositories/ahtapotops/mys.git/custom_hooks/post-receive destination2: /var/opt/gitlab/git-
data/repositories/ahtapotops/gdys.git/custom_hooks/post-receive destination3: /var/opt/gitlab/git-
data/repositories/ahtapotops/gkts.git/custom_hooks/post-receive owner: git
mode: 770 directory:
path1: /var/opt/gitlab/git-
data/repositories/ahtapotops/mys.git/custom_hooks/
path2: /var/opt/gitlab/git-
data/repositories/ahtapotops/gdys.git/custom_hooks/
path3: /var/opt/gitlab/git-
data/repositories/ahtapotops/gkts.git/custom_hooks/
owner: git group: git mode: 755
state: directory recurse: yes Server: yedek_git_lab Port: ssh_port
ansible:
Server: Ansible_sunucu_fqdn Port: ssh_port
3. FirewallBuilder
Ahtapot projesi kapsamında merkezde bulunacak ve güvenlik duvarlarının yönetilmesini
sağlayacak playbook’dur. “/etc/ansible/playbooks/” dizini altında bulunan “firewallbuilder.yml”
dosyasına bakıldığında, “hosts” satırında Ansible’a ait “/etc/ansible/” altında bulunan “hosts”
dosyasında “[firewallbuilder]” satırı altına yazılmış tüm sunucularda bu playbookun
oynatılacağı belirtilir. “remote_user” satırında, sistemler oynatılacak playbookun hangi kullanıcı ile oynatılacağı belirlenir. “sudo” satırı ile, çalışacak komutların sudo yetkisi ile çalışması
belirlenir. “roles” satırı altında bulunan satırlarda ise bu playbook çalıştığında “base” ve
“firewallbuilder” rollerinin çalışacağı belirtilmektedir. Ayrıca bu playbook ile Ansible rolünde çalışan sunuculara ait “ansible” rolü de çalıştırılır. Böylelikle GitLab tarafında yapılan her değişiklikte, Ansible makinası üzerindeki git depoları güncellenmiş olur.
$ more /etc/ansible/playbooks/firewallbuilder.yml
# Calistirildiginda FirewallBuilder Kurulumu Yapilir
- hosts: ansible
remote_user: ahtapotops sudo: yes
roles:
- { role: base } - { role: ansible } - hosts: firewallbuilder remote_user: ahtapotops sudo: yes
roles:
- { role: base }
- { role: firewallbuilder }
3.1 Base
Bu rol Ahtapot projesi kapsamındaki tüm sunucularda çalışan temel ayarlamaların yapıldığı roldür. Bu rolün görevleri:
- Tüm sistemlerde olması gereken paketlerin kurulum ve denetimleri:
- auditd,sysstat,ntp,bash,rsyslog,sudo
- Tüm sistemlerde bulunması gereken servislerin yapılandırılması:
- ntp, auditd, ssh
- Tüm sistemlerde yapılması gereken genel işlemler:
- sudo yapılandırma - sysctl yapılandırma - /etc/hosts yapılandırma - grub yapılandırma - rsyslog yapılandırma
- USB kullanım kapatma / açma
Bu roldeki değişkenler “/etc/ansible/roles/base/vars/main.yml” dosyasında belirtilmiştir.
“main.yml” dosyasının içeriği ve değişken bilgileri aşağıdaki gibidir;
- “group” fonksiyonunda sistemler üzerinde kullanılan kullanıcının ait olduğu grup bilgisi belirtilmektedir. “presentgroup” sistemde var olması gereken gruptur. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokedgroup” sistemden grubun silinmesini sağlar. Silinecek bir grup yok ise boş bırakılır.
group:
# Belirtilen grubun sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentgroup: ahtapotops
# Belirtilen grubun sunucudan silinmesini saglar.
revokedgroup:
- “user” fonksiyonunda sistemler üzerinde kullanılan kullanıcının bilgisi belirtilmektedir.
“presentuser” sistemde var olması gereken kullanıcıdır. İlgili sistemde bulunmaması durumda yeniden oluşturur. “revokeduser” sistemden kullanıcının silinmesini sağlar.
Silinecek bir kullanıcı yok ise boş bırakılır.
user:
# Belirtilen kullanicinin sunucu uzerinde var olup olmadigini kontrol eder.
# Olmamasi durumda olusturur.
presentuser: ahtapotops shell: /bin/bash
# Belirtilen kullanicinin sunucudan silinmesini saglar.
revokeduser:
- “packages” fonksiyonunda sistemler üzerine kurulacak paketler belirtilmektedir. “name”
satırında hangi paketlerin kurulacağı belirlenir. “updatecache” seçeneği ile “apt-get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller. “force” satırı ile kurulumun yapılması gerektiği durumlarda, her koşulda kurulumu tamamlamaya zorlar.
packages:
# Sisteme kurulacak paketleri belirler.
name: auditd,sysstat,ntp,bash,rsyslog,sudo updatecache: yes
state: present force: yes
- “repository” fonksiyonunda sistemlere eklenecek depo bilgileri verilmektedir. “repo”
satrında eklenecek deponun adresi belirtilmektedir. “url” satırında ihtiyaç olması
durumunda depo anahtarını belirtmek için kullanılılmaktadır. “updatecache” seçeneği ile
“apt-get update” komutu çalıştırılarak deponun güncel hali çekilir. “state” satırı ile paketlerin durumu ile ilgili bilgi verilir. Üç farklı değişken kullanılabilir; “present” paket yüklü ise herhangi değişiklik yapmaz. “absent” paketi kaldırır. “latest” paketin güncel versiyonu var ise günceller.
repository:
# Ahtapot projesi kapsaminda olusturulan paketlerin bulundugu repo adresidir.
repo: 'deb http://193.140.98.199/pardus-yenikusak pardus-ahtapot main'
# Pardus tarafından herhangi bir rep key ulasmadigindan dolayi kapatildi.
# url: 'http://ip_adres/packages/amd64/bilgio.asc' updatecache: yes
state: present
- “sudo” fonksiyonunda sudo yapılandırması yapılmaktadır. “source” satırında belirtilen ve “/etc/ansible/roles/base/templates” altında bulunan “sudoers.j2” dosyasında bulunan ayarları sunucular üzerinde gerçekleştirir. “destination” satırında ayarların yapılacağı sudoers dosyası belirlenir. “owner”, “group” ve “mode” ile bu dosyanın sahibi olan kullanıcı, grup ve hakları belirlenir. “iologdir” satırı ile sudo loglarının hangi dizine yazılacağı belirtilir. “group” ile hangi grup için bu ayarların yapılacağı belirtilir.
“newgroup” satırı, grupta bir değişlik olacağı durumlarda buraya yazılarak, değişikliğin sağlanmasına yaramaktadır. Grup değişmeyeceği sürece güncel grup adı ile kalmalıdır.
“commands” satırı ile ilgili grupa hangi komutlar için yetki verileceği belirtilmektedir.
“firewall” alt fonksiyonu ile Limitlik Kullanıcı Konsolunda kullanılacak kullanıcıya gerekli
sudo:
# Sudo yapilandirmasini belirtmektedir.
conf:
source: sudoers.j2
destination: /etc/sudoers owner: root
group: root mode: 440
iologdir: "/var/log/sudo-io/%{hostname}/%{user}"
group: ahtapotops newgroup: ahtapotops commands: ALL
firewall:
user: lkk
commands: /usr/sbin/iptraf
- “usb-storage” fonksiyonunda sistemlerdeki usb kapılarının açılıp/kapanması sağlanır.
“/etc/ansible/roles/base/templates” dizini altında bulunan “blacklist.conf.j2”
dosyasındaki izin verilmeyecek durumları modprobe’a yazar.
usb-storage:
# usb yapilandirmasini belirtmektedir.
conf:
source: blacklist.conf.j2
destination: /etc/modprobe.d/blacklist.conf owner: root
group: root mode: 644
- “logger” fonksiyonu ile sistemlerin ayakta ve log gönderebilir olduğunun kontrolünün yapılacağı script “/etc/ansible/roles/base/templates” dizini altında bulunan
“logger.sh.j2” dosyasından kopyalanarak cron’a eklenmektedir.
logger:
# heartbeat yapilandirmasini belirtmektedir.
cron:
source: logger.sh.j2
destination: /etc/cron.d/logger.sh owner: root
group: root mode: 755 min: "00"
hour: "*"
facility: local5 severity: info tag: "heartbeat"
message: "Heartbeat from $(hostname) at $(date) !"
- “ssh” fonksiyonunda sistemlerde ssh tanımlamaları, yapılandırma ve sıkılaştırma işlemleri yapılır. “conf” alt fonksiyonu ile “/etc/ssh/sshd_config” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda ssh servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “TrustedUserCAKeys” alt fonksiyonu ile sisteme eklenen CA imzalı açık anahtar bilgisi, bu anahtarın hakları ve erişim yetkileri belirlenir.
“LocalBanner” ve “RemoteBanner” alt fonksiyonları ile sunuculara bağlantı
kurulduğunda ekrana gelecek uyarı belirtilir. Bu satırlardan sonra gelen satırlarda, ssh yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/ssh/sshd_config” dosyasına bu değişiklikler yansıtılacaktır. Sistemlerde
kullanılacak ssh portunu varsıyan “22” değeri dışında başka bir değere atamak istenir ise, “Port” satırındaki 22 değeri olması istenen değer ile değiştirilmelidir.
ssh:
# ssh yapilandirmasini belirtmektedir.
conf:
source: sshd_config.j2
destination: /etc/ssh/sshd_config owner: root
group: root mode: 0644 service:
name: ssh state: started enabled: yes TrustedUserCAKeys:
source: ahtapot_ca.pub.j2
destination: /etc/ssh/ahtapot_ca.pub owner: root
group: root mode: 0644 LocalBanner:
source: issue.j2
destination: /etc/issue owner: root
group: root mode: 0644 RemoteBanner:
source: issue.net.j2
destination: /etc/issue.net owner: root
group: root mode: 0644 Port: 22 Protocol: 2
ListenAddressv4: 0.0.0.0 ListenAddressv6: "::"
UsePrivilegeSeparation: "yes"
KeyRegenerationInterval: 3600
ServerKeyBits: 1024 SyslogFacility: AUTH LogLevel: INFO LoginGraceTime: 90 PermitRootLogin: "no"
StrictModes: "yes"
RSAAuthentication: "yes"
PubkeyAuthentication: "yes"
IgnoreRhosts: "yes"
RhostsRSAAuthentication: "no"
HostbasedAuthentication: "no"
IgnoreUserKnownHosts: "yes"
PermitEmptyPasswords: "no"
ChallengeResponseAuthentication: "no"
PasswordAuthentication: "no"
KerberosAuthentication: "no"
KerberosOrLocalPasswd: "yes"
KerberosTicketCleanup: "yes"
GSSAPIAuthentication: "no"
GSSAPICleanupCredentials: "yes"
X11Forwarding: "no"
X11DisplayOffset: 10 PrintMotd: "yes"
PrintLastLog: "yes"
TCPKeepAlive: "yes"
UsePAM: "no"
UseLogin: "no"
- “ntp” fonksiyonunda sistemlerdeki ntp yapılandırması yapılmaktadır. “conf” alt
fonksiyonu ile “/etc/ntp.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service”
alt fonksiyonunda ntp servisinin değişikliklerden sonra yeniden başlatılması sağlanır.
“FirstNtpServerHost” satırına ilk NTP sunucusunun adı ve ya ip adresi girilir.
“SecondNtpServerHost” satırına ikinci NTP sunucusunun adı ve ya ip adresi girilir.
İkinci NTP sunucusu olmaması durumunda bu satırın başına “#” işareti konularak kullanım dışı kalması sağlanır.
ntp:
# ntp yapilandirmasini belirtmektedir.
conf:
source: ntp.conf.j2
destination: /etc/ntp.conf owner: root
group: root mode: 0644 service:
name: ntp state: started enabled: yes
# ntp server bilgileri girilmektedir.
FirstNtpServerHost: "0.debian.pool.ntp.org"
SecondNtpServerHost: "1.debian.pool.ntp.org"
- “hosts” fonksiyonunda “source” satırında belirtilen ve
“/etc/ansible/roles/base/templates” altında bulunan “hosts.j2” dosyanında yer alan host bilgilerini çalıştığı tüm makinalarda “/etc/hosts” dizini altına atmaktadır. Akabinde bu dosyanın hakları ve erişim yetkileri belirlenir.
hosts:
# /etc/hosts yapilandirmasini belirtmektedir.
conf:
source: hosts.j2
destination: /etc/hosts owner: root
group: root mode: 0644
- “grub” fonksiyonunda sunucularda grub parolası belirlenir. “conf” alt fonksiyonu ile kullanıcı/parola bilgileri girilir ve bu dosyanın hakları ve erişim yetkileri belirlenir. “conf2”
alt fonksiyonu ile ise girdiler belirlenir ve bu dosyanın hakları ve erişim yetkileri belirlenir.
“confile” ile dosya dizini belirtilir. “grubuser” ile kullanıcı bilgisi, “grubpass” ile parola bilgisi girilir.
grub:
# grub yapilandirmasini belirtmektedir.
conf:
source: grub_01_users.j2
destination: /etc/grub.d/01_users owner: root
group: root mode: 755 conf2:
source: grub_10_linux.j2
destination: /etc/grub.d/10_linux owner: root
group: root mode: 755
confile: "/boot/grub/grub.cfg"
grubuser: ahtagrub grubpass:
grub.pbkdf2.sha512.10000.2A82B914C527C90A5018614B88F1604955C46131AEF358D1CB8 1E604793F5DD973DC3B796A2AF691AECC835928F76774835920D11B7FBEB07F050FAAF231B75 4.9433A4A373F5FB7D5FC05E25E14CAC0FEAD7FDE2019BE0E5E5D3B7D98A06FA3DB018D3EC7A 0557B1D7BCDB3AD091B8C44E121B057931E72A0A1592A7392214DF
- “audit” fonksiyonunda sunucularda audit yapılandırmasının yapılamasını sağlamaktadır.
“conf” alt fonksiyonu ile “/etc/audit/auditd.conf” dosyasının hakları ve erişim yetkileri belirlenir. “service” alt fonksiyonunda audit servisinin değişikliklerden sonra yeniden başlatılması sağlanır. “rules” alt fonksiyonunda “/etc/audit/audit.rules” dosyasının hakları ve erişim yetkileri belirlenir. Bu satırlardan sonra gelen satırlarda, audit yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde
“/etc/audit/auditd.conf” dosyasına bu değişiklikler yansıtılacaktır.
audit:
# audit yapilandirmasini belirtmektedir.
conf:
source: auditd.conf.j2
destination: /etc/audit/auditd.conf owner: root
group: root mode: 0644 service:
name: auditd state: started enabled: yes rules:
source: audit.rules.j2
destination: /etc/audit/audit.rules owner: root
group: root mode: 0644 name: "ahtapotops"
name_format: "user"
log_file: /var/log/audit/audit.log log_format: RAW
log_group: "root"
max_log_file: 10
max_log_file_action: ROTATE num_logs: 5
priority_boost: 4 flush: INCREMENTAL freq: 20
disp_qos: lossy
dispatcher: /sbin/audispd space_left: 2000
space_left_action: SYSLOG action_mail_acct: "root"
admin_space_left: 1000
admin_space_left_action: SUSPEND
disk_full_action: SUSPEND disk_error_action: SUSPEND tcp_listen_queue: 5
tcp_max_per_addr: 1
tcp_client_ports: 1024-65535 tcp_client_max_idle: 0 enable_krb5: "no"
krb5_principal: auditd
krb5_key_file: /etc/audit/audit.key
- “sysctl” fonksiyonunda sunucular üzerinde sysctl yapılandırması yapılmaktadır. “conf”
alt fonksiyonu ile “/etc/sysctl.conf” dosyasına “/etc/ansible/roles/base/templates/”
altında bulunan “sysctl.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir.
Bu satırlardan sonra gelen satırlarda, sysctl yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/sysctl.conf” dosyasına bu değişiklikler yansıtılacaktır.
sysctl:
# sysctl yapilandirmasini belirtmektedir.
conf:
source: sysctl.conf.j2
destination: /etc/sysctl.conf owner: root
group: root mode: 0644
icmp_ignore_bougs_error_responses: 1 icmp_echo_ignore_broadcasts: 1
- “rsyslog” fonksiyonunda sunucularda rsyslog yapılandırmasının yapılamasını sağlamaktadır. “conf” alt fonksiyonu ile “/etc/rsyslog.conf” dosyasına
“/etc/ansible/roles/base/templates/” altında bulunan “rsyslog.conf.j2” dosyası kopyalanır ve hakları, erişim yetkileri belirlenir. “service” alt fonksiyonunda rsyslog servisinin değişikliklerden sonra yeniden başlatılması sağlanır. Bu satırlardan sonra gelen satırlarda, rsyslog yapılandırmasına ait bilgiler bulunup, değişiklik yapıldığı takdirde “/etc/rsyslog.conf” dosyasına bu değişiklikler yansıtılacaktır. “Server1” ve