Manuel kurulum

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):

  1. Sunucuya SSH ile bağlanın;
  2. Sistemi güncelleyin, ana bilgisayar adını ve saat dilimini ayarlayın;
  3. sudo yetkili normal bir kullanıcı oluşturun (root ile çalışmayın);
  4. SSH anahtarıyla girişi ayarlayın ve parolayla girişi kapatın;
  5. Güvenlik duvarını ve otomatik korumayı etkinleştirin;
  6. (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 2. Genel anahtarı sunucuya kopyalayın:

# macOS / Linux: ssh-copy-id deploy@203.0.113.10 # Windows (PowerShell): type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

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:

echo 'PermitRootLogin no' | sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null sudo systemctl restart ssh

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.
Tüm parametrelerin ayrıntılı incelemesi — SSS'te: “config.php dosyası — tüm panel ayarları”.

13. Web sunucusu için sudo yapılandırması

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
sudo chmod 440 /etc/sudoers.d/monitor sudo visudo -c # "parsed OK" olmalı

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:

sudo apt install acl sudo setfacl -R -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null sudo setfacl -d -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null

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:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec
/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:

location ^~ /data/ { deny all; } location ^~ /tmp/ { deny all; } location ^~ /logs/ { deny all; } location ^~ /includes/ { deny all; } location ^~ /cron/ { deny all; } location ^~ /database/ { deny all; } location = /config.php { deny all; }
^~ ö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 eklemeyin location /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:

  1. admin parolasını değiştirin — menüdeki “Kullanıcılar” bölümü.
  2. 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.
  3. 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).
  4. 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.
  5. Bildirimleri yapılandırın — “Ayarlar” bölümünde Telegram ve/veya Email. Ayrıntılar.
  6. Yükleyiciyi silin public/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):

18. Cron ve bakım

Bir kez ayarlanır, bu da isteğe bağlıdır ama önerilir. Ayrıntılı komutlar başvuru kılavuzunda:

  1. Cron görevleri (raporlar, liste güncelleme, denetimler);
  2. Yedekleme;
  3. Panelin güncellenmesi ve taşınması;
  4. Erişimin kurtarılması — anahtar/parola kaybı durumunda.
Bir şey çalışmıyor veya “veri yok” mu gösteriyor? Başvuru kılavuzunun “Tanılama” grubuna göz atın.
Arcivéo - Security Monitor © 2026