התקנה ידנית

התקנה ידנית מלאה: מ-VPS שזה עתה נרכש ועד לוח בקרה עובד, שלב אחר שלב. הכנת השרת, יצירת האתר, מסד הנתונים, config.php ו-SSL מפורטים כאן. הפקודות לכל כלי אבטחה ול-cron נמצאות במדריך ה-FAQ, עם קישורים לאורך הדרך.

הכלל החשוב ביותר: בעת שינוי SSH או חומת האש, אל תסגרו את החיבור הנוכחי לפני שבדקתם את החדש בחלון נפרד. אם בכל זאת איבדתם גישה — כמעט כל הספקים מציעים קונסולת חירום (VNC/Recovery) בלוח הבקרה.

01. קניתי VPS עם Ubuntu/Debian — איך מתחילים

אחרי הרכישה, ספק האחסון שולח: כתובת IP, שם משתמש (בדרך כלל root) וסיסמה (או מפתח SSH). זה מספיק כדי להתחבר. סדר הפעולות (כל שלב — פרק בהמשך):

  1. להתחבר לשרת דרך SSH;
  2. לעדכן את המערכת, להגדיר שם מארח ואזור זמן;
  3. ליצור משתמש רגיל עם הרשאות sudo (לא לעבוד תחת root);
  4. להגדיר התחברות באמצעות מפתח SSH ולהשבית התחברות באמצעות סיסמה;
  5. להפעיל חומת אש והגנה אוטומטית;
  6. (לפי הצורך) להתקין את לוח הבקרה HestiaCP — שרת אינטרנט, מסד נתונים ודוא"ל “מהקופסה”.

02. התחברות ראשונה דרך SSH

SSH הוא טרמינל מאובטח לשרת. הזינו את כתובת ה-IP שלכם במקום 203.0.113.10.

203.0.113.10 היא דוגמה, כתובת שאינה קיימת (שמורה לתיעוד). אל תזינו אותה כפי שהיא — החליפו אותה בכתובת ה-IP האמיתית של השרת שלכם מהמייל של חברת האחסון. אחרת ההתחברות לא תצליח.

Windows 10/11: פתחו את PowerShell או את “טרמינל” והשתמשו ב-ssh המובנה (או בלקוחות PuTTY / MobaXterm).
macOS / Linux: פתחו את “הטרמינל”.

# כניסה כ-root (הסיסמה התקבלה מחברת האחסון): ssh root@203.0.113.10 # אם חברת האחסון סיפקה קובץ מפתח במקום סיסמה: ssh -i path/to/key root@203.0.113.10
בהתחברות הראשונה SSH ישאל לגבי “authenticity of host” — הזינו yes. הסיסמה אינה מוצגת בעת ההקלדה (זה תקין). אם חברת האחסון נתנה סיסמה זמנית — החליפו אותה בפקודה passwd.

03. עדכון המערכת והגדרות בסיסיות

ראשית — לעדכן את כל החבילות ולהגדיר את שם המארח ואזור הזמן.

# עדכון המערכת: apt update && apt upgrade -y # כלי עזר בסיסיים: apt install -y curl wget ufw fail2ban unattended-upgrades # אזור זמן (דוגמה) ושם מארח: timedatectl set-timezone Asia/Jerusalem hostnamectl set-hostname myserver # עדכוני אבטחה אוטומטיים: dpkg-reconfigure -plow unattended-upgrades
רשימת אזורי הזמן — timedatectl list-timezones. אם בסיום העדכון יופיע חלון כחול “Daemons using outdated libraries” — סמן את כל השירותים (מקש רווח) ולחץ OK, זה בטוח.

04. יצירת משתמש עם sudo

עבודה קבועה תחת root אינה מאובטחת. צרו משתמש רגיל והעניקו לו הרשאות sudo (הרצת פקודות כמנהל לפי הצורך). החליפו את deploy בכל שם.

# יצירת משתמש (יוגדר סיסמה וייתבקשו פרטים — אפשר Enter): adduser deploy # הוספה לקבוצת sudo: usermod -aG sudo deploy # בדיקה (תחת root): su - deploy sudo whoami # צריך להדפיס: root exit
מכאן ואילך היכנסו לשרת כבר תחת משתמש זה: ssh deploy@203.0.113.10, ואת פקודות המנהל הריצו עם הקידומת sudo.

05. מפתחות SSH והשבתת כניסה בסיסמה

כניסה באמצעות מפתח בטוחה יותר מסיסמה: סיסמה אפשר לנחש, מפתח — כמעט בלתי אפשרי. תחילה יוצרים מפתח במחשב שלכם, מעתיקים אותו לשרת, בודקים את הכניסה — ורק אז משביתים את הסיסמה.

שלב 1. יצירת מפתח במחשב שלכם (Windows PowerShell / macOS / Linux):

ssh-keygen -t ed25519 -C "my-laptop" # Enter על כל השאלות (המפתח יישמר ב-~/.ssh/id_ed25519)

שלב 2. העתקת המפתח הציבורי לשרת:

# 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"

שלב 3. בדיקת הכניסה באמצעות המפתח בחלון חדש — הכניסה אמורה לעבוד ללא סיסמה:

ssh deploy@203.0.113.10
אל תבצעו את אפשרות B לפני שהכניסה באמצעות מפתח נבדקה ופועלת (שלבים 1–3), ואל תסגרו את ההפעלה הפעילה. היא משביתה את הכניסה בסיסמה עבור כל המשתמשים, כולל root. בלי מפתח עובד תאבדו לחלוטין את הגישה לשרת — ניתן יהיה לשחזר אותה רק דרך קונסולת האחסון. אין מפתח — בחרו באפשרות A.

שלב 4. הקשיחו את הגישה דרך SSH. את ההגדרות שמים בקובץ נפרד, בקובץ התצורה הראשי לא נוגעים. בחרו את האפשרות לפי המצב:

אפשרות A — רק לחסום את root, הסיסמה נשארת. אין צורך במפתח, לא תאבדו גישה:

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

אפשרות B — hardening מלא. השביתו את הכניסה בסיסמה והשאירו את root עם מפתח בלבד. בצעו זאת רק לאחר שווידאתם שהכניסה באמצעות מפתח עובדת:

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
בשתי האפשרויות הכניסה של root בסיסמה חסומה. PermitRootLogin no חוסם את root לחלוטין, prohibit-password — משאיר כניסה עם מפתח בלבד (לניהול היכנסו בתור deploy והשתמשו ב-sudo). אם ברצונכם לשנות את פורט ה-SSH — הוסיפו את השורה Port 2222, אך תחילה פתחו את הפורט החדש בחומת האש (בסעיף הבא) ובדקו את הכניסה, אחרת תחסמו לעצמכם את הגישה.

06. חומת אש בסיסית והגנה אוטומטית

חסמו את כל המיותר בחומת האש והפעילו את fail2ban (חוסם ניחוש סיסמאות ב-SSH). קודם התירו SSH, אחרת לאחר הפעלת UFW תאבדו גישה.

# התרת SSH (או הפורט שלכם, אם שיניתם) ואינטרנט: sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # הפעלת חומת האש: sudo ufw enable sudo ufw status verbose # fail2ban — הגנת SSH מפני ניחוש (פרופיל בסיסי פעיל מיד): sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
זה המינימום. הגדרות עבודה של fail2ban, רשימת חסימה ipsum, UFW מורחב ושאר הכלים — בקבוצת “כלי אבטחה” שבמדריך. לוח הבקרה של Arcivéo Monitor עצמו יציג בבירור את הסטטוס של כל זה.

07. התקנת לוח HestiaCP (אופציונלי)

HestiaCP — לוח בקרה חינמי לניהול אחסון: מתקין ומגדיר שרת אינטרנט (nginx + apache), PHP, מסד נתונים (MariaDB), דואר, DNS ותעודות SSL, ומספק ממשק אינטרנט לאתרים. נוח אם אין רצון להגדיר הכול ידנית ומתכננים לארח אתרים (כולל את לוח Arcivéo Monitor עצמו).

התקינו את HestiaCP על שרת נקי (Ubuntu/Debian עדכני ונתמך, מינימום ~1–2 GB RAM), לפני התקנת שרתי אינטרנט ומסדי נתונים אחרים — אחרת יתרחשו התנגשויות. ההתקנה נמשכת 10–20 דקות ותאתחל את השרת.
# הורדת תוכנת ההתקנה והרצתה: wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh sudo bash hst-install.sh

תוכנת ההתקנה תבקש כתובת דוא"ל ושם מארח, ואז תתקין את כל הערימה. לאחר האתחול הלוח זמין בכתובת https://YOUR_IP:8083 (שם המשתמש והסיסמה יוצגו בסוף ההתקנה).

HestiaCP מנהל בעצמו את UFW ואת fail2ban — אין צורך להגדיר אותם בנפרד, הוא יזהה אותם. עדיין כדאי להגדיר מפתחות SSH ולנטרל את הסיסמה (הסעיף הקודם).

08. דרישות מערכת ו-ionCube

הפאנל הוא יישום PHP על מחסנית LAMP/LEMP טיפוסית:

  • מערכת הפעלה: Linux (מומלץ Ubuntu/Debian);
  • שרת אינטרנט: nginx או Apache עם PHP-FPM;
  • PHP 8.0+ עם ההרחבות: pdo_mysql, openssl, curl, json, mbstring;
  • ionCube Loader — הרחבת PHP הנדרשת לפעולת הפאנל;
  • מסד נתונים: MySQL 5.7+ או MariaDB 10.3+;
  • HTTPS — חובה (הכניסה ו-WebAuthn פועלים רק דרך https);
  • sudo עבור משתמש שרת האינטרנט (סט מצומצם — שלב 13).
# בדיקת גרסת PHP וההרחבות: php -v php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'

התקנת ionCube Loader (אם עדיין לא מותקן). באחסון עם פאנל (HestiaCP, cPanel) ionCube מופעל בסימון תיבה בהגדרות PHP. ידנית ב-Ubuntu/Debian:

# בדיקת גרסת PHP וספריית ההרחבות: php -v EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') # הורדה וחילוץ של הלואדרים (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 שלכם לספריית ההרחבות: sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/ # חיבור (CLI + PHP-FPM) והפעלה מחדש: 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 # בדיקה — בפלט תופיע השורה "with the ionCube PHP Loader": php -v
גרסת הלואדר חייבת להתאים לגרסת ה-PHP (למשל ioncube_loader_lin_8.1.so עבור PHP 8.1). אם אתם משתמשים בכמה גרסאות PHP — חברו לואדר עבור כל אחת.

09. דומיין ו-DNS

כדי לפתוח את הפאנל בכתובת כמו monitor.example.com ולקבל SSL חינם — דרוש דומיין שמצביע אל השרת שלכם. בפאנל ניהול ה-DNS צרו רשומת A:

סוג: A שם: monitor (תת-דומיין → monitor.example.com) או @ (שורש הדומיין → example.com) ערך: 203.0.113.10 ← ה-IP של השרת שלכם TTL: 3600

לאחר כמה דקות בדקו שהדומיין מצביע אל השרת:

dig +short monitor.example.com # אמור להחזיר את ה-IP שלכם # או, אם dig לא קיים: getent hosts monitor.example.com
אישור ה-SSL של Let's Encrypt מונפק רק לדומיין — ה-DNS חייב להצביע אל השרת לפני הנפקת האישור.

10. יצירת אתר והעלאת קובצי הפאנל

Apache: DocumentRoot — לשורש הפאנל, ולא ל־public/. קובצי העיצוב (CSS/JS), sw.js ו־manifest.json נמצאים ב־assets/ לצד public/ ונטענים משורש האתר. הקובץ .htaccess בשורש הוא ה־front-controller. אם ב־Apache מגדירים את DocumentRoot ל־public/ — הפאנל ייפתח ללא עיצוב. ב־nginx נקי המצב הפוך: השורש הוא public/, ואילו assets/ מוגשים בכלל נפרד (ראו בלוק nginx למטה).
קובצי הפאנל (ארכיון ההפצה) מורדים לאחר הרכישה באזור האישי my.arciveo.com“הורדות”. חלצו את הארכיון לפני ההעלאה.

1) צרו את תיקיית הפאנל והעלו אליה את תוכן ההפצה (כך שבפנים יימצאו public/, assets/, config.php וכו'):

sudo mkdir -p /var/www/monitor # לאחר מכן העלו את קובצי ההפצה אל /var/www/monitor (FileZilla / WinSCP / scp)

2) הגדירו את שרת האינטרנט. Apache: DocumentRoot — לשורש הפאנל (ולא ל־/public); AllowOverride All הוא חובה. הנתיב לסוקט PHP-FPM מזוהה אוטומטית. יש להדביק את הבלוק בטרמינל במלואו:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # זיהוי אוטומטי של סוקט PHP-FPM 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 אין .htaccess, ולכן השורש הוא public/, ואילו assets/, sw.js ו־manifest.json (ברמה שמעל) מוגשים בכלל נפרד:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # זיהוי אוטומטי של סוקט PHP-FPM 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 ו־manifest נמצאים ברמה שמעל public/ 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

העלאת קבצים — SFTP/SCP (FileZilla, WinSCP) או scp:

# דוגמה דרך scp מהמחשב המקומי: scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
הגדירו הרשאות לקבצים — זהו שלב חובה. אם ההעלאה בוצעה תחת root או דרך SFTP, הקבצים שייכים ל־root, ושרת האינטרנט (www-data) לא יוכל לקרוא אותם — הפאנל ייפתח ריק או עם שגיאת 403 (ביומן: .htaccess unreadable / directory not executable). הפקודה שלמטה מתקנת זאת:
# מנרמלים את ההרשאות של כל ה־webroot: תיקייה שנוצרה על ידי root אינה נגישה # לשרת האינטרנט (www-data) — בלי זה הפאנל מגיש דף ריק או 403. # Apache פועל תחת www-data; אם אצלכם משתמש אינטרנט אחר — החליפו אותו. cd /var/www/monitor # את תיקיות העבודה יוצרים לפני chown — אחרת תיקיות חדשות יישארו root:root # ובעת chmod 750 שרת האינטרנט (www-data) לא יוכל לכתוב אליהן. 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. אחרי הפקודה שלמעלה כל הקבצים שייכים ל-www-data, בעוד FileZilla / WinSCP מתחברים עם המשתמש שלכם — ואז ההעלאה נכשלת עם SSH_FX_PERMISSION_DENIED (Permission denied). גם התחברות כ-root לצורך העלאה אינה אפשרית — כניסת root הושבתה בשלב 05. בחרו באחת משתי האפשרויות.

אפשרות A — ACL עבור המשתמש שלכם בלבד (מומלץ). הרשאת כתיבה מקבלים רק אתם; שרת האינטרנט עדיין אינו יכול לדרוס את קוד הפאנל:

sudo apt install -y acl # הרשאת כתיבה למשתמש שלכם על כל תיקיית הפאנל: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # אותו כלל כברירת מחדל — לקבצים ולתיקיות שייווצרו בהמשך: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

אפשרות B — דרך הקבוצה www-data. פשוטה יותר, אבל הרשאת כתיבה לקבצי הפאנל מקבל גם שרת האינטרנט: אם תימצא חולשה ב-PHP יהיה אפשר להחליף את הקוד. סדר הפקודות חשוב — config.php ותיקיות העבודה נסגרות אחרונות:

sudo usermod -aG www-data deploy # כתיבה לקבוצה + setgid (הביט 2): קבצים שהועלו ב-SFTP נשארים # בקבוצה www-data — אחרת הפאנל לא יוכל לדרוס אותם. 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 התחברו מחדש ב-FileZilla (שרת ← ניתוק, ואז כניסה מחדש) — הקבוצה החדשה נכנסת לתוקף רק בכניסה חדשה, ועד אז עדיין לא יהיו לכם הרשאות. בדיקה: id deploy — ברשימת הקבוצות צריכה להופיע www-data; ls -ld /var/www/monitor — הרשאות drwxrwsr-x, והאות s במקום x פירושה ש-setgid מוגדר.

11. מסד נתונים

צרו מסד נתונים ומשתמש, ולאחר מכן ייבאו את הסכמה. הבלוק מודבק לטרמינל במלואו. monitor_db ו־monitor_user הם שמות לדוגמה, תוכלו להגדיר משלכם; זכרו את שם המסד, המשתמש והסיסמה — תזינו אותם ב־config.php בשלב הבא:

# 1. מסד נתונים. הסיסמה מוגדרת פעם אחת ב-DBPASS ומוצבת בכל השורות. # הבלוק מודבק לטרמינל במלואו; sudo mysql נכנס כ-root דרך unix-סוקט # (סיסמת root לא נדרשת). אל תשתמשו ב-`sudo mysql -u root -p` אינטראקטיבי # עם הדבקה — בעת ההדבקה שורות ה-SQL ילכו לבקשת הסיסמה ויאבדו. DBPASS='CHOOSE_A_PASSWORD' # ← שנו רק את השורה הזו 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 # בדיקה (אמורה להציג את monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # את אותה הסיסמה הזינו ב-config.php → DB_PASS.
אין צורך לייבא את הסכמה — הפאנל יוצר בעצמו את הטבלאות ואת חשבון admin בכניסה הראשונה בדפדפן (מתוך database/db.sql), אם המסד ריק. ייבוא ידני של הסכמה נדרש רק אם האתחול האוטומטי לא פעל.
אם השתמשתם במתקין הדפדפן public/start_db.phpמחקו אותו מיד לאחר ההתקנה: הוא מאפשר ליצור מחדש את המסד ללא הרשאה. כל עוד הקובץ נמצא בשורש הפאנל או ב־public/, הפאנל מציג אזהרה אדומה.

12. הגדרת config.php

config.php בשורש הפאנל (/var/www/monitor/config.php) הוא הקובץ היחיד שצריך לערוך ידנית. כל הגדרות הפאנל מוגדרות בו כקבועים define(). פתחו אותו בעורך:

sudo nano /var/www/monitor/config.php

הזינו את הערכים שלכם במקומות המסומנים; את השאר השאירו כפי שהוא:

// --- מסד נתונים (מצעד 11) --- define('DB_HOST', 'localhost'); // להשאיר define('DB_NAME', 'db_name'); // מה שיצרתם בצעד 11 define('DB_USER', 'user'); // מה שיצרתם בצעד 11 define('DB_PASS', 'db_password'); // מה שהגדרתם בצעד 11 define('DB_CHARSET', 'utf8mb4'); // להשאיר // --- אפליקציה --- define('APP_URL', 'https://monitor.example.com'); // כתובת הפאנל, ללא לוכסן בסוף define('TIMEZONE', 'Asia/Jerusalem'); // אזור הזמן שלכם // --- זמן הפעלת סשן --- define('SESSION_LIFETIME', 28800); // חוסר פעילות עד כניסה מחדש, שנ' (28800 = 8 ש')

מה לשנות:

  • DB_NAME, DB_USER, DB_PASS — בדיוק אותם שם מסד, משתמש וסיסמה שהגדרתם ביצירת המסד בצעד 11 (אם השארתם את הדוגמאות — monitor_db / monitor_user). את DB_HOST ו-DB_CHARSET אל תיגעו.
  • APP_URL — הכתובת המלאה של הפאנל עם https://, ללא לוכסן בסוף וללא www. חייבת להתאים לדומיין שעליו מפעילים את הרישיון (צעד 16), אחרת המפתח יידחה.
  • TIMEZONE — אזור הזמן שלכם (רשימה — timedatectl list-timezones). משפיע רק על אופן הצגת התאריכים בפאנל; על זמן הפעלת משימות cron אינו משפיע (שם חל אזור הזמן של המערכת).
  • SESSION_LIFETIME — אחרי כמה שניות של חוסר פעילות הפאנל יבקש להיכנס מחדש (ברירת מחדל 8 שעות). למשל 3600 = שעה, 86400 = יממה.
  • בלוק תיעוד השגיאות (display_errors, log_errors, error_log) — השאירו כברירת מחדל.

שמרו את הקובץ (Ctrl+O, Enter, ואז Ctrl+X) והפעילו מחדש את PHP-FPM — אחרת בגלל OPcache השינויים לא ייכנסו לתוקף:

sudo systemctl restart php*-fpm
config.php — קובץ סודי (יש בו את סיסמת המסד). הוא נמצא בשורש הפאנל, שהוא גם שורש האתר, אך חסום: הרשאות 640 (הוגדרו בצעד 10) ואיסור מפורש ב-.htaccess הראשי. אל תעלו אותו למאגרים ציבוריים ואל תשלחו אותו לתמיכה עם סיסמה אמיתית.
ניתוח מפורט של כל הפרמטרים — ב-FAQ: “קובץ config.php — כל הגדרות הפאנל”.

13. הגדרת sudo עבור שרת האינטרנט

PHP רץ תחת משתמש שרת האינטרנט, שאין לו הרשאות לפקודות מערכת. הגישה ניתנת בצמצום: sudo נקודתי לכלים ספציפיים וקריאת יומנים דרך קבוצות (ללא sudo). פריצת שכבת האינטרנט אינה מקנה root.

בדוגמאות www-data הוא משתמש ברירת המחדל של Apache. אם אצלכם המשתמש שונה (בחלק מהפאנלים PHP רץ תחת משתמש נפרד) — החליפו בכל מקום. לבדיקה: ps -o user= -C php-fpm | sort -u.

1. צרו /etc/sudoers.d/monitor באמצעות sudo visudo -f /etc/sudoers.d/monitor והדביקו (הסירו שורות של מודולים שאינם בשימוש):

# UFW — status ו-rules (עמוד “חומת אש”) 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 — status, ban ו-unban (banned מחזיר את החסימות של כל ה-jail בפקודה אחת; # ban/unban נחוצים לכפתורי הלוח) 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 * # עדכוני אבטחה (כרטיס “עדכונים”). קריאה בלבד, אך דווקא מ-root: # מטמון apt (~70 MB) נגיש רק ל-root, משתמש שאינו root בונה אותו מחדש בכל קריאה # (4.2 שנ' CPU לעומת 0.01 שנ'). ללא wildcard — בדיוק הפקודה האחת הזו, לא מתקינה דבר. www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable # IPset (מפת התקפות, דאשבורד) 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 — חיפוש אירועים + קריאת השורות האחרונות ביומן (נתיב מדויק) 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 # פורטים פתוחים (יומני הליבה/SSH/Falco נקראים ללא sudo — דרך קבוצת # systemd-journal, ראו סעיף 2; אין צורך לתת sudo ל-journalctl וזה לא בטוח) www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln # PostgreSQL (רק אם בשימוש) — סקריפט קריאה-בלבד קבוע, # צרו לפי ה-FAQ “PostgreSQL אינו מוצג”; בלעדיו מחקו את השורה www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor sudo visudo -c # צריך להיות "parsed OK"

2. גישה ליומנים וליומן systemd. המודולים קוראים את /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide ישירות (ב-Debian/Ubuntu יומנים אלו בקבוצת adm). אירועי הליבה, SSH ו-Falco נלקחים מ-journald בפקודת journalctl ללא sudo, דרך קבוצת systemd-journal. הוסיפו את משתמש האינטרנט לשתי הקבוצות והפעילו מחדש את PHP-FPM:

sudo usermod -aG adm,systemd-journal www-data sudo systemctl restart php*-fpm # חובה, אחרת הקבוצות לא יחולו

3. אם ClamAV או Suricata כותבים יומנים לא לקבוצת adm (קורה root:root) — תנו גישה דרך ACL:

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. יומן הביקורת של ה-WAF (/var/log/apache2/modsec_audit.log) שייך ל-root עם הרשאות 640, ומשתמש האינטרנט אינו יכול לקרוא אותו ישירות. עמוד ModSecurity שולף את מצב המנוע, האירועים ורשימת הכללים הפעילים דרך סקריפט קריאה-בלבד קבוע — הוא זה שמורשה ב-sudoers בשורה שלמעלה:

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 ה-WAF עצמו אינו פועל: החבילה מניחה רק את modsecurity.conf-recommended, ומנוע הכללים נשאר כבוי — כיצד להפעילו, ראו FAQ ← “התקנת ModSecurity”.
המשתמש בכל שורות ה-sudoers חייב להתאים למשתמש של מאגר ה-FPM: ב-Apache/Debian רגיל זהו www-data, ב-HestiaCP מאגר האתר רץ תחת בעל האתר (למשל admin) — בדקו grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.

5. אם לפני Apache עומד Nginx (HestiaCP, ISPmanager ופאנלים אחרים — שם Nginx מנתב את PHP אל Apache, ואת התוכן הסטטי מגיש בעצמו). ספריות שירות סגורות בקבצי .htaccess, אך Nginx אינו קורא אותם: כל קובץ סטטי (.json, .txt, .log, .dat) יוגש על ידו ישירות, תוך עקיפת Apache. החוצה ידלפו מטמוני הפאנל ונתונים — למשל tmp/modsec_cache.json עם אירועי ה-WAF וכתובות ה-IP של התוקפים. הוסיפו איסור לתצורת האתר של Nginx:

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; }
הקידומת ^~ הכרחית: היא נבחרת לפני הכלל הרגולרי לתוכן הסטטי בתוך location /, אחרת האיסור לא יופעל.
ב-HestiaCP הניחו זאת כקובץ נפרד /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (ו-nginx.conf_deny עבור HTTP) — תצורת האתר מחברת את nginx.ssl.conf_* ובבנייה מחדש אינה מוחקת קבצים כאלה. להחלה: sudo nginx -t && sudo systemctl reload nginx.
בדיקה: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — צריך להיות 403. אם Apache פועל ללא Nginx (מאזין ל-80/443 בעצמו), אין צורך להוסיף דבר — .htaccess מספיק.
בדקו את הנתיבים אל הבינאריים באמצעות which (למשל which ufw cscli ausearch ss). ערכו את sudoers רק באמצעות visudo. רשימת כל מסדי הנתונים של MySQL מופעלת ב-GRANT נפרד (FAQ ← “נראה רק מסד נתונים אחד”).

14. הגבלת גישה לפי IP

הגבילו את הגישה למוניטור לפי כתובת IP — גם אם ה-URL ייחשף, דף ההתחברות לא ייפתח. אפשר ברמת שרת האינטרנט (דוגמה ל-nginx למטה) או בפאנל עצמו (“הגדרות” ← “הגבלת גישה לפי IP”). אם אתם משתמשים ב-Apache, השתמשו בהגבלה שבפאנל.

אם אתר ה-nginx כבר הוגדר לפי שלב 10, אל תוסיפו location / נוסף — הוסיפו את השורות allow/deny לבלוק הקיים. שני location / זהים באותו server { } הם שגיאת תצורה, ו-nginx לא יופעל מחדש.
# בתצורת nginx (בתוך server { }): # את נתיב ה-ACME של Let's Encrypt משאירים פתוח בעקיפת הגבלת ה-IP — # כדי שהנפקת וחידוש ה-SSL האוטומטי (שלב 15) לא יהיו תלויים בסינון ה-IP. location ^~ /.well-known/acme-challenge/ { allow all; } location / { allow 203.0.113.10; # ← הזינו את ה-IP שלכם allow 10.0.0.0/8; # רשת מקומית (במידת הצורך) deny all; try_files $uri $uri/ /index.php?$query_string; } # להפעיל מחדש את nginx: sudo nginx -t && sudo systemctl reload nginx

15. הנפקת SSL (HTTPS)

הלוח פועל רק דרך HTTPS. סשן הכניסה משתמש בעוגייה מאובטחת, ו-WebAuthn (2FA) פועל רק ב-HTTPS. דרך http:// אי אפשר להתחבר.

האישור חינמי (Let's Encrypt). ה-DNS של הדומיין כבר צריך להצביע לשרת. הפקודה תלויה בשרת האינטרנט:

# Apache: sudo certbot --apache -d monitor.example.com # nginx — רק אם אתם באמת משתמשים ב-nginx. ב-Apache אל תריצו: # apt ימשוך את nginx ויתפוס את פורט 80, התנגשות עם Apache. # sudo apt install python3-certbot-nginx # sudo certbot --nginx -d monitor.example.com # certbot בעצמו יגדיר HTTPS בקונפיג ויסדיר חידוש אוטומטי
מה certbot ישאל: e-mail ← הסכמה ל-Terms (Y) ← שיתוף ה-e-mail עם EFF (לשיקולכם). לאחר מכן ינפיק בעצמו את האישור, ירשום <VirtualHost *:443>, יגדיר הפניה http→https וחידוש אוטומטי.
ה-DNS חייב להצביע לשרת לפני הרצת certbot (אימות בעלות דרך פורט 80). בדיקה: dig +short monitor.example.com ← כתובת ה-IP של השרת. פורטים 80/443 פתוחים: sudo ufw allow 80,443/tcp.

לאחר ההנפקה: https://monitor.example.com נפתח עם מנעול, http:// מפנה ל-https:// (APP_URL ב-config.php כבר הוגדר בשלב 12).

16. כניסה והגדרה ראשונית

פתחו https://monitor.example.com, היכנסו עם admin / useradmin ועברו על רשימת המשימות:

  1. החלפת סיסמת admin — מקטע “משתמשים” בתפריט.
  2. הפעלת WebAuthn (2FA) — “מפתחות WebAuthn” ← רישום מפתח/passkey (דורש HTTPS). רשמו מיד שניים: אם המפתח היחיד יאבד, לא תוכלו להיכנס באמצעותו. לפרטים נוספים.
  3. הגבלת גישה לפי IP — “הגדרות” ← “הגבלת גישה לפי IP” (הזינו את כתובת ה-IP שלכם לפני ההפעלה, אחרת תחסמו לעצמכם את הגישה).
  4. הזנת רישיון — הפעילו את הקוד ARCIVEO-… מהאזור האישי על הדומיין שלכם והדביקו את המפתח ב“הגדרות” ← “רישיון”. לפרטים נוספים.
  5. הגדרת התראות — Telegram ו/או Email ב“הגדרות”. לפרטים נוספים.
  6. מחיקת תוכנית ההתקנה public/start_db.php, אם נותרה (שלב 11).

17. כלי אבטחה (אופציונלי)

הלוח כבר פועל. הכלים מותקנים לפי הצורך — מתקינים מה שדרוש, והלוח יציג מיד את הסטטוס. פקודות ההתקנה של כל אחד נמצאות במדריך (סעיפים נפרדים לכל כלי):

18. Cron ותחזוקה

מוגדר פעם אחת, גם זה אופציונלי אך מומלץ. פקודות מפורטות — במדריך:

  1. משימות Cron (דוחות, עדכון רשימות, בדיקות);
  2. גיבוי;
  3. עדכון והעברת הפאנל;
  4. שחזור גישה — למקרה של אובדן מפתח/סיסמה.
משהו לא עובד או מציג “אין נתונים”? הציצו בקבוצת “אבחון” במדריך.
Arcivéo - Security Monitor © 2026