Tamamen elle kurulum: yeni satın alınmış bir VPS'ten çalışan panele kadar, adım adım.
Sunucu hazırlığı, site oluşturma, veritabanı, config.php ve SSL burada anlatılıyor.
Her güvenlik aracına ve cron'a ait komutlar
FAQ başvuru kılavuzunda, bağlantılar akış içinde.
En önemli kural: SSH veya güvenlik duvarını değiştirirken, yeni ayarı ayrı bir pencerede doğrulamadan mevcut bağlantıyı kapatmayın. Erişimi yine de kaybederseniz — neredeyse tüm barındırma sağlayıcıları kontrol panelinde acil durum konsolu (VNC/Recovery) sunar.
01. Ubuntu/Debian ile VPS aldım — nereden başlamalı
Satın alma sonrasında barındırma sağlayıcısı şunları gönderir: IP adresi, kullanıcı adı (genelde root) ve parola (ya da SSH anahtarı). Giriş için bu kadarı yeterli. İşlem sırası (her adım aşağıda bir bölüm):
Sunucuya SSH ile bağlanın;
Sistemi güncelleyin, ana bilgisayar adını ve saat dilimini ayarlayın;
sudo yetkili normal bir kullanıcı oluşturun (root ile çalışmayın);
SSH anahtarıyla girişi ayarlayın ve parolayla girişi kapatın;
Güvenlik duvarını ve otomatik korumayı etkinleştirin;
(isteğe bağlı) HestiaCP yönetim panelini kurun — web sunucusu, veritabanı ve e-posta hazır gelir.
02. SSH ile ilk bağlantı
SSH, sunucuya güvenli bir terminaldir. 203.0.113.10 yerine kendi IP adresinizi yazın.
203.0.113.10 yalnızca örnektir, var olmayan bir adrestir (belgeler için ayrılmıştır). Olduğu gibi girmeyin — hosting sağlayıcınızın e-postasındaki gerçek sunucu IP adresinizle değiştirin. Aksi hâlde bağlantı kurulmaz.
Windows 10/11: PowerShell'i veya “Terminal”i açın ve yerleşik ssh aracını kullanın (ya da PuTTY / MobaXterm istemcilerini). macOS / Linux: “Terminal”i açın.
# root ile giriş (parola hosting sağlayıcıdan gelir):
ssh root@203.0.113.10
# Hosting sağlayıcı parola yerine anahtar dosyası verdiyse:
ssh -i anahtar/yolu root@203.0.113.10
İlk bağlantıda SSH “authenticity of host” hakkında sorar — yes yazın. Parola girilirken görünmez (bu normaldir). Hosting sağlayıcı geçici bir parola verdiyse, passwd komutuyla değiştirin.
03. Sistem güncelleme ve temel yapılandırma
İlk iş — tüm paketleri güncellemek, ana bilgisayar adını ve saat dilimini ayarlamak.
# Sistemi güncelle:
apt update && apt upgrade -y
# Temel araçlar:
apt install -y curl wget ufw fail2ban unattended-upgrades
# Saat dilimi (örnek) ve ana bilgisayar adı:
timedatectl set-timezone Europe/Istanbul
hostnamectl set-hostname myserver
# Otomatik güvenlik güncellemeleri:
dpkg-reconfigure -plow unattended-upgrades
Saat dilimleri listesi — timedatectl list-timezones. Güncellemenin sonunda “Daemons using outdated libraries” mavi penceresi çıkarsa — tüm hizmetleri işaretleyin (Boşluk) ve OK'a basın, bu güvenlidir.
04. sudo yetkili kullanıcı oluşturma
Sürekli root ile çalışmak güvenli değildir. Normal bir kullanıcı oluşturup ona sudo yetkisi verin (gerektiğinde komutları yönetici olarak çalıştırma). deploy yerine istediğiniz adı yazın.
# Kullanıcı oluştur (parola belirler ve bilgi ister — Enter'a basılabilir):
adduser deploy
# sudo grubuna ekle:
usermod -aG sudo deploy
# Kontrol et (root olarak):
su - deploy
sudo whoami # şunu yazdırmalı: root
exit
Bundan sonra sunucuya bu kullanıcıyla girin: ssh deploy@203.0.113.10, yönetici komutlarını ise sudo önekiyle çalıştırın.
05. SSH anahtarları ve parola ile girişi kapatma
Anahtarla giriş paroladan daha güvenlidir: parola tahmin edilebilir, anahtar ise neredeyse imkânsızdır. Önce kendi bilgisayarınızda anahtar oluşturur, sunucuya kopyalar, girişi doğrular ve ancak ondan sonra parolayı kapatırız.
Adım 1. Kendi bilgisayarınızda anahtar oluşturun (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Tüm sorulara Enter (anahtar ~/.ssh/id_ed25519 içine yazılır)
Adım 3.Yeni bir pencerede anahtarla girişi doğrulayın — parola sormadan girmeli:
ssh deploy@203.0.113.10
Anahtarla giriş doğrulanıp çalışmadan (Adım 1–3) Seçenek B'yi uygulamayın ve çalışan oturumu kapatmayın. Bu, root dahil tüm kullanıcılar için parolayla girişi kapatır. Çalışan bir anahtar olmadan sunucuya erişimi tamamen kaybedersiniz — erişimi yalnızca hosting sağlayıcının konsolu üzerinden geri alabilirsiniz. Anahtarınız yoksa Seçenek A'yı kullanın.
Adım 4. SSH erişimini sıkılaştırın. Ayarları ayrı bir dosyaya koyuyoruz, ana yapılandırmaya dokunmuyoruz. Duruma göre seçeneği belirleyin:
Seçenek A — yalnızca root'u kapatın, parola kalsın. Anahtar gerekmez, erişimi kaybetmezsiniz:
Seçenek B — tam hardening. Parolayla girişi kapatın ve root'u yalnızca anahtarla bırakın. Bunu yalnızca anahtarla girişin çalıştığından emin olduktan sonra uygulayın:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
KbdInteractiveAuthentication no
EOF
sudo systemctl restart ssh
Her iki seçenekte de parolayla root girişi kapalıdır. PermitRootLogin no root'u tamamen yasaklar, prohibit-password — girişi yalnızca anahtarla bırakır (yönetim için deploy ile girip sudo kullanırsınız). SSH portunu değiştirmek isterseniz Port 2222 satırını ekleyin, ancak önce yeni portu güvenlik duvarında açın (sonraki bölüm) ve girişi doğrulayın, aksi halde kendi erişiminizi kapatırsınız.
06. Temel güvenlik duvarı ve otomatik koruma
Gereksiz olan her şeyi güvenlik duvarıyla kapatın ve fail2ban'ı etkinleştirin (SSH üzerinden parola deneme saldırılarını banlar). Önce SSH'a izin verin, aksi halde UFW'yi etkinleştirdikten sonra erişimi kaybedersiniz.
# SSH (veya değiştirdiyseniz kendi portunuz) ve web erişimine izin ver:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Güvenlik duvarını etkinleştir:
sudo ufw enable
sudo ufw status verbose
# fail2ban — SSH'ı deneme saldırılarından korur (temel profil hemen aktiftir):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Bu asgari düzeydir. Çalışan fail2ban ayarları, ipsum blok listesi, gelişmiş UFW ve diğer araçlar başvurunun “Güvenlik araçları” grubunda yer alır. Arcivéo Monitor panelinin kendisi tüm bunların durumunu net biçimde gösterir.
07. HestiaCP paneli kurulumu (isteğe bağlı)
HestiaCP — ücretsiz bir barındırma yönetim paneli: web sunucusunu (nginx + apache), PHP'yi, veritabanını (MariaDB), postayı, DNS'i ve SSL sertifikalarını kurup yapılandırır, siteler için web arayüzü sağlar. Her şeyi elle yapılandırmak istemiyorsanız ve site barındırmayı (Arcivéo Monitor panelinin kendisi dahil) planlıyorsanız kullanışlıdır.
HestiaCP'yi temiz bir sunucuya kurun (güncel, desteklenen bir Ubuntu/Debian, en az ~1–2 GB RAM), başka web sunucuları ve veritabanı kurmadan önce — aksi halde çakışmalar olur. Kurulum 10–20 dakika sürer ve sunucuyu yeniden başlatır.
# Yükleyiciyi indir ve çalıştır:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Yükleyici e-posta ve ana bilgisayar adını soracak, ardından tüm yığını kuracaktır. Yeniden başlatmadan sonra panele https://YOUR_IP:8083 adresinden erişilebilir (kullanıcı adı ve parolayı yükleyici en sonda gösterir).
HestiaCP, UFW ve fail2ban'ı kendisi yönetir — bunları ayrıca yapılandırmanıza gerek yok, otomatik olarak devralır. SSH anahtarlarını ve parola girişini kapatmayı (önceki bölüm) yine de yapın.
08. Sistem gereksinimleri ve ionCube
Panel, tipik bir LAMP/LEMP yığını üzerinde çalışan bir PHP uygulamasıdır:
İşletim sistemi: Linux (Ubuntu/Debian önerilir);
Web sunucusu: PHP-FPM ile nginx veya Apache;
PHP 8.0+ şu uzantılarla: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — panelin çalışması için gerekli PHP uzantısı;
Veritabanı: MySQL 5.7+ veya MariaDB 10.3+;
HTTPS — zorunlu (giriş ve WebAuthn yalnızca https üzerinden çalışır);
sudo web sunucusu kullanıcısı için (dar bir küme — adım 13).
# PHP sürümünü ve uzantıları kontrol et:
php -v
php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'
ionCube Loader kurulumu (henüz kurulu değilse). Panelli bir barındırmada (HestiaCP, cPanel) ionCube, PHP ayarlarındaki bir onay kutusuyla etkinleştirilir. Ubuntu/Debian üzerinde elle:
# PHP sürümünü ve uzantı dizinini öğren:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Loader'ları indir ve aç (64-bit):
cd /tmp
wget -q https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
# PHP sürümüne uygun loader'ı uzantı dizinine kopyala:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Etkinleştir (CLI + PHP-FPM) ve yeniden başlat:
echo "zend_extension=ioncube_loader_lin_${PHPVER}.so" | sudo tee /etc/php/${PHPVER}/mods-available/ioncube.ini
sudo phpenmod ioncube
sudo systemctl restart php${PHPVER}-fpm
# Kontrol — çıktıda "with the ionCube PHP Loader" satırı görünür:
php -v
Loader sürümü PHP sürümüyle eşleşmelidir (örneğin PHP 8.1 için ioncube_loader_lin_8.1.so). Birden fazla PHP sürümü kullanıyorsanız her biri için loader'ı etkinleştirin.
09. Alan adı ve DNS
Paneli monitor.example.com gibi bir adresten açmak ve ücretsiz SSL almak için sunucunuza yönlendiren bir alan adı gerekir. DNS yönetim panelinde bir A kaydı oluşturun:
Tür: A
Ad: monitor (alt alan adı → monitor.example.com)
veya @ (kök alan adı → example.com)
Değer: 203.0.113.10 ← sunucunuzun IP adresi
TTL: 3600
Birkaç dakika sonra alan adının sunucuya yönlendiğini kontrol edin:
dig +short monitor.example.com # IP adresinizi döndürmeli
# veya dig yoksa:
getent hosts monitor.example.com
Let's Encrypt SSL sertifikası yalnızca alan adına verilir — sertifika oluşturulmadan önce DNS sunucuya yönlenmelidir.
10. Site oluşturun ve panel dosyalarını yükleyin
Apache: DocumentRoot panelin köküne, public/ dizinine DEĞİL. Stiller (CSS/JS), sw.js, manifest.json dosyaları public/ ile aynı seviyedeki assets/ içindedir ve site kökünden istenir. Kökteki .htaccess ön denetleyicidir. Apache altında DocumentRoot public/ dizinine ayarlanırsa panel stiller olmadan açılır. Saf nginx için tam tersi: kök olarak public/ alınır, assets/ ise ayrı bir kuralla sunulur (aşağıdaki nginx bloğuna bakın).
Panel dosyaları (dağıtım arşivi), satın alma sonrasında my.arciveo.com hesabında → “İndirmeler” bölümünden indirilir. Yüklemeden önce arşivi çıkarın.
1) Panel dizinini oluşturun ve içine dağıtım içeriğini yükleyin (böylece içinde public/, assets/, config.php vb. bulunur):
sudo mkdir -p /var/www/monitor
# ardından dağıtım dosyalarını /var/www/monitor içine yükleyin (FileZilla / WinSCP / scp)
2) Web sunucusunu yapılandırın.Apache: DocumentRoot panelin köküne (/public dizinine DEĞİL); AllowOverride All zorunludur. PHP-FPM soket yolu otomatik belirlenir. Blok terminale tamamıyla yapıştırılır:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # PHP-FPM soketinin otomatik belirlenmesi
sudo tee /etc/apache2/sites-available/monitor.conf > /dev/null <<'EOF'
<VirtualHost *:80>
ServerName monitor.example.com
DocumentRoot /var/www/monitor
<Directory /var/www/monitor>
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost"
</FilesMatch>
</VirtualHost>
EOF
sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/monitor.conf
sudo a2dissite 000-default.conf
sudo a2ensite monitor.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
nginx: nginx'in .htaccess dosyası yoktur, bu yüzden kök olarak public/ alınır, assets/, sw.js, manifest.json (bir üst seviyede) ise ayrı bir kuralla sunulur:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # PHP-FPM soketinin otomatik belirlenmesi
sudo tee /etc/nginx/sites-available/monitor.conf > /dev/null <<'EOF'
server {
listen 80;
server_name monitor.example.com;
root /var/www/monitor/public;
index index.php;
# assets, service worker ve manifest, public/ dizininin bir üst seviyesindedir
location ~ ^/(assets/|sw\.js|manifest\.json) { root /var/www/monitor; }
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:__PHPSOCK__;
}
}
EOF
sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/nginx/sites-available/monitor.conf
sudo ln -s /etc/nginx/sites-available/monitor.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Dosya yükleme — SFTP/SCP (FileZilla, WinSCP) veya scp:
# Yerel bilgisayardan scp ile örnek:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Dosya izinlerini ayarlayın — bu zorunlu bir adımdır. Dosyaları root altında veya SFTP ile yüklediyseniz dosyalar root kullanıcısına aittir ve web sunucusu (www-data) bunları okuyamaz — panel boş açılır veya 403 hatası verir (günlükte: .htaccess unreadable / directory not executable). Aşağıdaki komut bunu düzeltir:
# Tüm web kök dizininin izinlerini normalleştiriyoruz: root tarafından oluşturulan dizin
# web sunucusu (www-data) tarafından erişilemez — bu yapılmazsa panel boş sayfa veya 403 döndürür.
# Apache www-data altında çalışır; farklı bir web kullanıcınız varsa değiştirin.
cd /var/www/monitor
# Çalışma klasörlerini chown'DAN ÖNCE oluşturuyoruz — aksi halde yeni dizinler root:root kalır
# ve chmod 750 ile web sunucusu (www-data) bunlara yazamaz.
sudo mkdir -p data/lynis data/logwatch tmp logs
sudo chown -R www-data:www-data /var/www/monitor
sudo find /var/www/monitor -type d -exec chmod 755 {} \;
sudo find /var/www/monitor -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 750 data tmp logs
3) SFTP ile dosya yüklemeyi kendinize açın. Yukarıdaki komuttan sonra tüm dosyalar www-data sahipliğindedir, oysa FileZilla / WinSCP kendi kullanıcınızla bağlanır — yükleme o zaman SSH_FX_PERMISSION_DENIED (Permission denied) hatasıyla başarısız olur. Yükleme için root ile giriş yapmak mümkün değil — root girişi 05. adımda kapatıldı. İki seçenekten birini tercih edin.
Seçenek A — yalnızca kendi kullanıcınız için ACL (önerilir). Yazma iznini yalnızca siz alırsınız; web sunucusu panel kodunun üzerine hâlâ yazamaz:
sudo apt install -y acl
# Kullanıcınıza panelin tüm dizini için yazma izni:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Aynı kural varsayılan olarak — sonradan oluşturulacak dosya ve klasörler için:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Seçenek B — www-data grubu üzerinden. Daha basit, ama panel dosyalarına yazma iznini web sunucusu da alır: PHP'de bir açık olması durumunda kod değiştirilebilir. Komutların sırası önemlidir — config.php ve çalışma klasörleri en sona kapatılır:
sudo usermod -aG www-data deploy
# Gruba yazma izni + setgid (2 biti): SFTP ile yüklenen dosyalar www-data
# grubunda kalır — aksi hâlde panel onların üzerine yazamaz.
sudo find /var/www/monitor -type d -exec chmod 2775 {} \;
sudo find /var/www/monitor -type f -exec chmod 664 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
B seçeneğinden sonra FileZilla'da yeniden bağlanın (Sunucu → Bağlantıyı kes, ardından yeniden giriş yapın) — yeni grup ancak yeni bir oturum açmada geçerli olur, o ana kadar yine izniniz olmaz. Kontrol: id deploy — grup listesinde www-data görünmelidir; ls -ld /var/www/monitor — izinler drwxrwsr-x, x yerine gelen s harfi setgid'in ayarlandığı anlamına gelir.
11. Veritabanı
Veritabanı ve kullanıcı oluşturun, ardından şemayı içe aktarın. Blok terminale tamamen yapıştırılır. monitor_db ve monitor_user örnek adlardır, istediğinizi belirleyebilirsiniz; veritabanı adını, kullanıcıyı ve parolayı unutmayın — bir sonraki adımda bunları config.php içine yazacaksınız:
# 1. Veritabanı. Parola DBPASS içinde BİR kez belirlenir ve tüm satırlara yerleştirilir.
# Blok terminale TAMAMEN yapıştırılır; sudo mysql, unix soketiyle root olarak girer
# (root parolası gerekmez). İnteraktif `sudo mysql -u root -p` komutunu kopyala-yapıştır
# ile KULLANMAYIN — yapıştırırken SQL satırları parola sorusuna gider ve kaybolur.
DBPASS='CHOOSE_A_PASSWORD' # ← yalnızca bu satırı değiştirin
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS';
GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost';
FLUSH PRIVILEGES;
SQL
# Doğrulama (monitor_db görünmeli):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Aynı parolayı config.php → DB_PASS içine yazın.
Şemayı içe aktarmaya gerek yok — veritabanı boşsa, panel ilk tarayıcı girişinde tabloları ve admin hesabını kendisi oluşturur (database/db.sql dosyasından). Şemayı elle içe aktarma, yalnızca otomatik başlatma çalışmadıysa gerekir.
public/start_db.php tarayıcı kurulum aracını kullandıysanız — kurulumdan hemen sonra onu silin: yetkilendirme olmadan veritabanını yeniden oluşturmaya izin verir. Dosya panel kök dizininde veya public/ içinde durduğu sürece panel kırmızı bir uyarı gösterir.
12. config.php yapılandırması
Panelin kök dizinindeki config.php (/var/www/monitor/config.php) — elle düzenlemeniz gereken tek dosyadır. Tüm panel ayarları bu dosyada define() sabitleriyle tanımlanır. Bir düzenleyicide açın:
sudo nano /var/www/monitor/config.php
Vurgulanan yerlere kendi değerlerinizi yazın; geri kalanını olduğu gibi bırakın:
// --- Veritabanı (adım 11'den) ---
define('DB_HOST', 'localhost'); // olduğu gibi bırakın
define('DB_NAME', 'db_name'); // adım 11'de oluşturduğunuz
define('DB_USER', 'user'); // adım 11'de oluşturduğunuz
define('DB_PASS', 'db_password'); // adım 11'de belirlediğiniz
define('DB_CHARSET', 'utf8mb4'); // olduğu gibi bırakın
// --- Uygulama ---
define('APP_URL', 'https://monitor.example.com'); // panel adresi, sonunda eğik çizgi olmadan
define('TIMEZONE', 'Europe/Istanbul'); // saat diliminiz
// --- Oturum süresi ---
define('SESSION_LIFETIME', 28800); // yeniden girişe kadar boşta kalma süresi, sn (28800 = 8 saat)
Neyi değiştirmeli:
DB_NAME, DB_USER, DB_PASS — adım 11'de veritabanını oluştururken belirlediğiniz veritabanı adı, kullanıcı ve parolayla tam olarak aynısı (örnekleri bıraktıysanız — monitor_db / monitor_user). DB_HOST ve DB_CHARSET değerlerine dokunmayın.
APP_URL — panelin tam adresi, https:// ile, sonunda eğik çizgi olmadan ve www olmadan. Lisansı etkinleştireceğiniz alan adıyla (adım 16) aynı olmalı, aksi halde anahtar reddedilir.
TIMEZONE — saat diliminiz (liste — timedatectl list-timezones). Yalnızca panelin tarihleri nasıl gösterdiğini etkiler; cron görevlerinin çalışma zamanını etkilemez (orada sistemin saat dilimi geçerlidir).
SESSION_LIFETIME — kaç saniye hareketsizlikten sonra panelin yeniden giriş isteyeceği (varsayılan 8 saat). Örn. 3600 = 1 saat, 86400 = 1 gün.
Hata günlükleme bloğu (display_errors, log_errors, error_log) — varsayılan haliyle bırakın.
Dosyayı kaydedin (Ctrl+O, Enter, ardından Ctrl+X) ve PHP-FPM'i yeniden başlatın — aksi halde OPcache nedeniyle değişiklikler uygulanmaz:
sudo systemctl restart php*-fpm
config.php — gizli bir dosyadır (içinde veritabanı parolası vardır). Panelin kök dizininde bulunur, bu da web köküdür, ancak korumalıdır: 640 izinleri (adım 10'da verildi) ve kök .htaccess içinde açık bir yasak. Bunu herkese açık depolara koymayın ve gerçek parolayla desteğe göndermeyin.
PHP, sistem komutları üzerinde yetkisi olmayan web sunucusu kullanıcısı adına çalışır. Erişim dar kapsamlı verilir: belirli araçlar için noktasal sudo ve gruplar üzerinden günlük okuma (sudo olmadan). Web katmanının ele geçirilmesi root vermez.
Örneklerde www-data — standart Apache kullanıcısıdır. Sizde farklıysa (bazı panellerde PHP ayrı bir kullanıcı altındadır) — her yerde değiştirin. Öğrenmek için: ps -o user= -C php-fpm | sort -u.
1.sudo visudo -f /etc/sudoers.d/monitor ile /etc/sudoers.d/monitor dosyasını oluşturun ve yapıştırın (kullanmadığınız modüllerin satırlarını kaldırın):
# UFW — durum ve kurallar (“Güvenlik duvarı” sayfası)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]*
# Fail2ban — durum, ban ve ban kaldırma (banned tüm jail'lerin banlarını tek komutla verir;
# ban/unban panel düğmeleri için gereklidir)
www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status, /usr/bin/fail2ban-client status *, /usr/bin/fail2ban-client banned, /usr/bin/fail2ban-client set * banip *, /usr/bin/fail2ban-client set * unbanip *
# Güvenlik güncellemeleri (“Güncellemeler” kartı). Yalnızca okuma, ama tam olarak root'tan:
# apt önbelleği (~70 MB) yalnızca root'a erişilebilir, root olmayan onu her çağrıda yeniden oluşturur
# (4.2 s CPU'ya karşı 0.01 s). Wildcard olmadan — tam olarak bu tek komut, hiçbir şey kurmaz.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (saldırı haritası, kontrol paneli)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ipset list -t ipsum
# CrowdSec
www-data ALL=(ALL) NOPASSWD: /usr/bin/cscli decisions list *, /usr/bin/cscli alerts list *, /usr/bin/cscli bouncers list *, /usr/bin/cscli scenarios list *
# Auditd — olay arama + günlüğün son satırlarını okuma (tam yol)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ausearch -m *
www-data ALL=(ALL) NOPASSWD: /usr/bin/tail -n 300 /var/log/audit/audit.log
# Monit / ModSecurity / AppArmor / PSAD
www-data ALL=(ALL) NOPASSWD: /usr/bin/monit status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/apache2ctl -M
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
www-data ALL=(ALL) NOPASSWD: /usr/sbin/aa-status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/psad --Status
# Açık portlar (çekirdek/SSH/Falco günlükleri sudo OLMADAN okunur — systemd-journal
# grubu üzerinden, bkz. madde 2; journalctl için sudo vermek GEREKMEZ ve güvenli değildir)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (yalnızca kullanıyorsanız) — sabit salt okunur betik,
# “PostgreSQL görünmüyor” SSS'ine göre oluşturun; onsuz satırı silin
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
2. Günlüklere ve systemd günlüğüne erişim. Modüller /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide dosyalarını doğrudan okur (Debian/Ubuntu'da bu günlükler adm grubundadır). Çekirdek, SSH ve Falco olayları journald'dan journalctl komutuyla sudo olmadan, systemd-journal grubu üzerinden alınır. Web kullanıcısını her iki gruba ekleyin ve PHP-FPM'i yeniden başlatın:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # zorunlu, aksi halde gruplar uygulanmaz
3. ClamAV veya Suricata günlüklerini adm grubuna yazmıyorsa (bazen root:root olur) — ACL üzerinden erişim verin:
4. ModSecurity sarmalayıcısı. WAF denetim günlüğü (/var/log/apache2/modsec_audit.log) 640 haklarıyla root'a aittir, web kullanıcısı onu doğrudan okuyamaz. ModSecurity sayfası motor modunu, olayları ve etkin kurallar listesini sabit bir salt okunur betik üzerinden alır — bu betik de yukarıdaki satırla sudoers içinde izinlidir:
/etc/modsecurity/modsecurity.conf dosyası olmadan WAF'ın kendisi çalışmaz: paket yalnızca modsecurity.conf-recommended koyar ve kural motoru kapalı kalır — nasıl etkinleştirileceği için bkz. SSS → “ModSecurity kurulumu”.
sudoers'taki tüm satırlardaki kullanıcı, FPM havuzunun kullanıcısıyla eşleşmelidir: sıradan Apache/Debian'da bu www-data'dır, HestiaCP'de sitenin havuzu site sahibi adına çalışır (örneğin admin) — grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf ile kontrol edin.
5. Apache'nin önünde Nginx varsa (HestiaCP, ISPmanager ve diğer paneller — orada Nginx PHP'yi Apache'ye proxy'ler, statiği ise kendisi sunar). Hizmet dizinleri .htaccess dosyalarıyla kapatılmıştır, ama Nginx bunları okumaz: herhangi bir statik dosyayı (.json, .txt, .log, .dat) Apache'yi atlayarak doğrudan sunar. Panel önbellekleri ve veriler dışarı sızar — örneğin WAF olayları ve saldırganların IP adreslerini içeren tmp/modsec_cache.json. Nginx site yapılandırmasına engel ekleyin:
^~ öneki zorunludur: location / içindeki statik için olan düzenli ifade kuralından önce seçilir, aksi halde engel işe yaramaz.
HestiaCP'de bunu ayrı bir /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny dosyası olarak koyun (ve HTTP için nginx.conf_deny) — site yapılandırması nginx.ssl.conf_* dosyalarını dahil eder ve yeniden derlemede bu dosyaları silmez. Uygulamak için: sudo nginx -t && sudo systemctl reload nginx.
Kontrol: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — sonuç 403 olmalı. Apache Nginx olmadan çalışıyorsa (80/443'ü kendisi dinliyorsa) hiçbir şey eklemeye gerek yok — .htaccess yeterlidir.
İkili dosyaların yollarını which ile kontrol edin (örneğin which ufw cscli ausearch ss). sudoers'ı yalnızca visudo üzerinden düzenleyin. Tüm MySQL veritabanlarının listesi ayrı bir GRANT ile açılır (SSS → “Yalnızca tek bir veritabanı görünüyor”).
14. IP ile erişim kısıtlama
Monitöre erişimi IP adresine göre kısıtlayın — URL öğrenilse bile giriş sayfası açılmaz. Web sunucusu düzeyinde (nginx için örnek aşağıda) veya panelin kendisinde (“Ayarlar” → “IP ile erişim kısıtlama”) yapılabilir. Apache kullanıyorsanız paneldeki kısıtlamayı kullanın.
nginx sitesi 10. adıma göre zaten yapılandırıldıysa, ikinci bir tane eklemeyinlocation / — allow/deny satırlarını mevcut bloğa yazın. Aynı server { } içinde iki özdeş location / bir yapılandırma hatasıdır, nginx yeniden başlamaz.
# nginx yapılandırmasında (server { } içinde):
# Let's Encrypt ACME yolunu IP kısıtlamasının dışında açık tutuyoruz —
# SSL'in verilmesi ve otomatik yenilenmesi (15. adım) IP filtresine bağlı olmasın.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← kendi IP adresinizi yazın
allow 10.0.0.0/8; # yerel ağ (gerekiyorsa)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# nginx'i yeniden yükle:
sudo nginx -t && sudo systemctl reload nginx
15. SSL (HTTPS) sertifikası oluşturun
Panel yalnızca HTTPS üzerinden çalışır. Giriş oturumu güvenli bir çerez kullanır ve WebAuthn (2FA) yalnızca HTTPS'te çalışır. http:// ile giriş yapılamaz.
Sertifika ücretsizdir (Let's Encrypt). Etki alanının DNS'i zaten sunucuyu göstermelidir. Komut web sunucusuna göre değişir:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — YALNIZCA gerçekten nginx kullanıyorsanız. Apache'de ÇALIŞTIRMAYIN:
# apt nginx'i çeker ve 80 portunu kaplar, Apache ile çakışır.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot HTTPS'i yapılandırmaya kendisi yazar ve otomatik yenilemeyi ayarlar
certbot neler soracak: e-posta → Terms onayı (Y) → e-postanın EFF'ye iletilmesi (sizin tercihinize bağlı). Ardından sertifikayı kendisi oluşturur, <VirtualHost *:443> ekler, http→https yönlendirmesini ve otomatik yenilemeyi ayarlar.
DNS, certbot çalıştırılmadan ÖNCE sunucuyu göstermelidir (sahiplik doğrulaması 80. port üzerinden yapılır). Kontrol: dig +short monitor.example.com → sunucu IP'si. 80/443 portları açık: sudo ufw allow 80,443/tcp.
Oluşturma sonrası: https://monitor.example.com kilit simgesiyle açılır, http:// adresini https:// adresine yönlendirir (config.php içindeki APP_URL 12. adımda zaten ayarlandı).
16. Giriş ve ilk kurulum
https://monitor.example.com adresini açın, admin / useradmin ile giriş yapın ve kontrol listesini tamamlayın:
WebAuthn (2FA) etkinleştirin — “WebAuthn anahtarları” → anahtar/passkey kaydedin (HTTPS gerektirir). Hemen iki tane kaydedin: tek anahtarınızı kaybederseniz onunla giriş yapmanız mümkün olmaz. Ayrıntılar.
IP ile erişimi kısıtlayın — “Ayarlar” → “IP ile erişim kısıtlaması” (etkinleştirmeden önce kendi IP adresinizi girin, aksi halde kendi erişiminizi kaparsınız).
Lisansı girin — hesabınızdaki ARCIVEO-… kodunu kendi alan adınız için etkinleştirin ve anahtarı “Ayarlar” → “Lisans” bölümüne yapıştırın. Ayrıntılar.
Bildirimleri yapılandırın — “Ayarlar” bölümünde Telegram ve/veya Email. Ayrıntılar.
Yükleyiciyi silinpublic/start_db.php, hâlâ duruyorsa (adım 11).
17. Güvenlik araçları (isteğe bağlı)
Panel zaten çalışıyor. Araçlar isteğe bağlı kurulur — neye ihtiyacınız varsa onu kurarsınız, panel durumu hemen gösterir. Her birinin kurulum komutları başvuru kılavuzunda (araçlara göre ayrı bölümler):
Bu, Arcivéo Security Monitor'ün yalnızca görüntüleme amaçlı demosudur — tüm değişiklikler devre dışıdır. Gerçek güvenlik verilerini yönetmek için kendi sunucunuza kurun.