Debian 7の安全で高速なWebサーバー

この記事は執筆中ですが、良いアドバイスやコメントを聞いて、資料を追加または修正する準備ができています。

まず、この資料は、初心者と同じVPSに複数のサイトを同時に持ち、同時に安全でスマートなWebサーバーの両方が必要なユーザーを対象としています。

Webサーバーとして、次のものがあります。



Apache 2.2 + PHP 5.4.4 + MySQL 5.5 + NGINX 1.2.1 + eAccelerator + memcached + vsftpd 3.0.2 + exim。



この奇跡はすべてDebian 7でスピンします。



始めましょう。





そのため、まず、OSをインストールした後、次のことを行います。



apt-get update apt-get dist-upgrade
      
      







次に、1つのコマンドで必要なソフトウェアをすべて配置します。

 apt-get install htop atop vsftpd exim4-base exim4-daemon-light mailutils rcconf apache2 apache2-mpm-itk nginx mysql-server-5.5 mysql-client-5.5 php5 php5-dev memcached libmysqlclient-dev apache2-utils libexpat1 ssl-cert libapache2-mod-php5 libapache2-mod-ruby php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-common php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl make automake checkinstall gcc gzip libreadline-dev libssl-dev libncurses5-dev zlib1g-dev
      
      







インストール中に、システムはMySQLデータベースのrootユーザーのパスワードを考えて入力するように求めます。

ソフトウェアが完全にインストールされたら、構成に進みます。 弊社のすべてのサイトは、ディレクトリ/ home / user_directory / site_directoryにありますが、都合の良い任意のディレクトリに配置できます。 サイトディレクトリには、tmp(一時ファイルとセッションファイル用)、ログ(サイトログ)、public_html(サイ​​トディレクトリ)の3つのサブディレクトリがあります。



同じ名前のグループ、ホームディレクトリ、およびコンソールの使用禁止を持つdapfユーザーを作成します。

 useradd dapf -b /home -m -U -s /bin/false
      
      







dapfユーザーのパスワードを設定します。

 passwd dapf
      
      







権限とグループを使用してユーザーディレクトリを作成します。

 mkdir -p -m 755 /home/dapf/dapf.ru/public_html mkdir -p -m 777 /home/dapf/dapf.ru/logs mkdir -p -m 777 /home/dapf/dapf.ru/tmp chmod 755 /home chmod 755 /home/dapf chmod +t /home/dapf/dapf.ru/logs chmod +t /home/dapf/dapf.ru/tmp chown -R dapf:dapf /home/dapf
      
      







コンソールをwww-dataユーザーに対して拒否します。

 usermod -s /bin/false www-data
      
      







それでは、Apacheの設定を始めましょう。

必要なモジュールを含めます。

 a2enmod ssl a2enmod rewrite a2enmod suexec a2enmod include
      
      







/etc/apache2/ports.confファイルのポート構成を編集します。

 nano /etc/apache2/ports.conf
      
      







ポート80を81に置き換える必要があります(80mでnginxがあるため)。

 NameVirtualHost *:81 Listen 81
      
      







弱いVPS(256 MBのRAM)があるため、/ etc / apache2 / apache2.confを構成する必要があります

 nano /etc/apache2/apache2.conf
      
      







以下の値を設定します。

 KeepAlive Off StartServers 1 MinSpareServers 3 MaxSpareServers 6 ServerLimit 24 MaxClients 24 MaxRequestsPerChild 3000
      
      







次に、新しいVirtualHost(サイト)を作成します。

 nano /etc/apache2/sites-available/dapf.ru
      
      





 <VirtualHost *:81> ServerName www.dapf.ru ServerAlias dapf.ru ServerAdmin support@dapf.ru DocumentRoot "/home/dapf/dapf.ru/public_html" <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /home/dapf/dapf.ru/public_html/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog /home/dapf/dapf.ru/logs/errors.log LogLevel warn CustomLog /home/dapf/dapf.ru/logs/access.log combined AssignUserId www-data dapf php_admin_value open_basedir "/home/dapf/:." php_admin_value upload_tmp_dir "/home/dapf/dapf.ru/tmp" php_admin_value session.save_path "/home/dapf/dapf.ru/tmp" </VirtualHost>
      
      







apache2-mpm-itkのおかげで、仮想ホスト構成でAssignUserId www-data dapfディレクティブを使用できます。これにより、o + w権限を持つものを除き、Webシェルを無効にしてプロジェクトファイルを編集できます。 つまり apacheはphpファイルを落ち着いて読み取って実行し、ブラウザに送信できますが、その内容を変更することはできず、ハッカーにとって特定の問題が発生します。 Apacheでファイルを編集できるようにする場合は、www-data dapfの代わりにdapf dapfを使用します。 ディレクティブopen_basedir、upload_tmp_dir、session.save_pathは、近隣サイトからのセッションの受信とユーザーディレクトリの上の遷移を除外します。



次のサイトが含まれます。

 a2ensite dapf.ru
      
      







Apacheを再起動します。

 service apache2 restart
      
      







Apacheが完成したので、nginxを構成します。

まず、gzip圧縮を構成し、ユーザーwww-dataを割り当てて、1プロセッサーコアをインストールします。

 nano /etc/nginx/nginx.conf
      
      





 user www-data; worker_processes 1; pid /var/run/nginx.pid; error_log /var/log/nginx/error.log; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; gzip_proxied any; gzip_comp_level 7; #Level Compress gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascri$ ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
      
      







仮想ホストの新しい構成を作成した後:



 nano /etc/nginx/sites-enabled/dapf.ru
      
      





 server { listen 80; server_name dapf.ru www.dapf.ru; access_log /var/log/nginx.access_log; location ~* .(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|html|htm|mp3|docx|xlsx)$ { root /home/dapf/dapf.ru/public_html/; error_page 404 = @fallback; index index.html index.php; access_log off; expires 30d; } location ~ /.ht { deny all; } location / { proxy_pass http://127.0.0.1:81/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_set_header Host $host; proxy_connect_timeout 60; proxy_send_timeout 90; proxy_read_timeout 90; proxy_redirect off; proxy_set_header Connection close; proxy_pass_header Content-Type; proxy_pass_header Content-Disposition; proxy_pass_header Content-Length; } location @fallback { proxy_pass http://127.0.0.1:81; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } }
      
      







これで、Apacheがすべてのダイナミクスとnginxスタティックを担当し、mod_rewrite(CNC)の使用時に発生する可能性のある404エラーが発生すると、@ fallback関数が呼び出され、検証のためにリクエストがApacheにリダイレクトされます。



service nginx restart



service nginx restart







FTPを構成するには、vsftpd構成ファイルを編集します

 nano /etc/vsftpd.conf
      
      







すべてを削除し、次の設定を挿入します。

 listen=YES anonymous_enable=NO local_enable=YES write_enable=YES pasv_min_port=50000 pasv_max_port=60000 dirmessage_enable=YES xferlog_enable=YES file_open_mode=0644 local_umask=022 connect_from_port_20=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to our FTP service. chroot_local_user=YES allow_writeable_chroot=YES secure_chroot_dir=/var/run/vsftpd pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/vsftpd.pem
      
      







これにより、匿名ユーザーのログインが防止され、古いFTPクライアントの使用が許可され、ユーザーがホームディレクトリにのみ移動できるように制限されます。



次に、/ etc / pam.d / vsftpdファイルを修正して、コンソールにアクセスできないユーザーのFTP認証を有効にする必要があります。

 nano /etc/pam.d/vsftpd
      
      







次の行を見つけてコメントします:auth required pam_shells.so

 #auth required pam_shells.so
      
      







vsftpdを再起動し、ログインを試行します。

 service vsftpd restart
      
      







エラーが発生した場合:500 OOPS:vsftpd:chroot()内の書き込み可能なルートでの実行を拒否し、動揺しないでください-これはvsftpdのバグであり、これを行うための簡単な更新で解決されます:

 echo "deb http://ftp.us.debian.org/debian jessie main contrib non-free" >> /etc/apt/sources.list aptitude update aptitude upgrade vsftpd echo "allow_writeable_chroot=YES" >> /etc/vsftpd.conf service vsftpd restart
      
      







vsftpdの設定を再設定する必要があるかもしれませんが、サービスを再起動した後、すべてが正常に機能します。



MySQLを構成します。

 nano /etc/mysql/my.cnf
      
      







次のディレクティブ値を設定します。

 key_buffer = 16K max_allowed_packet = 1M thread_stack = 64K table_cache = 4 sort_buffer = 64K net_buffer_length = 2K
      
      







InnoDBテーブルを使用していない場合は、skip-innodbディレクティブを追加できます



次に、コマンドを実行してユーザーとデータベースを作成します。

 echo "CREATE USER '_'@'localhost' IDENTIFIED BY '_'; GRANT USAGE ON * . * TO '_'@'localhost' IDENTIFIED BY '_' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS _ DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; ; GRANT ALL PRIVILEGES ON _ . * TO '_'@'localhost';" | mysql --user=root --password=__ mysql
      
      







値データベース、user_password、password_music_routeは独自のものを指定します。



作業の大部分は完了しました。今度は、PHP + eAccelerator + eximを構成する必要があります。



Eximをセットアップすることから始めましょう:

 dpkg-reconfigure exim4-config
      
      







[OK]を選択してから、インターネットサイトを選択します。 メールはSMTPを使用して直接送受信され、システムメール名( dapf.ruがあります )を指定します。着信SMTP接続をリッスンするIPアドレスは、127.0.0.1のままにして、ルートに到達するまで試飲できます。ポストマスターのメール受信者、そこに手紙が返されるあなたのメールを示します。



チェックのために実施します:

 echo "test" | mail -s Test @email.com
      
      







手紙が届いたら、すべてがうまくいき、そうでなければ、Eximに戻って再構成します。

eAcceleratorをインストールします。



現時点で最新バージョンをダウンロードして解凍します。

 wget https://codeload.github.com/eaccelerator/eaccelerator/legacy.tar.gz/master -O ea.tar.gz tar xvfz ea.tar.gz
      
      







eacceleratorのソースがあるディレクトリに移動し(eaccelerator-eaccelerator-42067acを持っています)、インストールします:

 cd eaccelerator-eaccelerator-42067ac phpize ./configure make make install
      
      







eAcceleratorキャッシュ用のディレクトリを作成します

 mkdir -p /var/cache/eaccelerator chmod 0777 /var/cache/eaccelerator
      
      







php.iniファイルの編集

 nano /etc/php5/apache2/php.ini
      
      







ここで、EximがあるeAccelerator、sendmail、セキュリティ設定などの設定を追加する必要があります。

eAcceleratorの[PHP]設定の前に追加

 ; eAccelerator configuration ; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension ; If you are using a thread safe build of PHP you must use ; zend_extension_ts instead of zend_extension extension = "eaccelerator.so" eaccelerator.shm_size = "16" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.allowed_admin_path = "/var/www/eaccelerator"
      
      







sendmail_pathのコメントを外し、Eximへのパスを指定します

 sendmail_path = /usr/sbin/exim -t
      
      







次に、次の設定を設定します。

 ;         display_errors =Off log_errors=On ;   disable_functions = exec,ini_get,ini_get_all,parse_ini_file,passthru,php_uname,popen,proc_open,shell_exec,show_source,system,dl, show_source, readfile, popen, cwd,getcwd ;     : diskfreespace, disk_free_space, disk_total_space, eval, fileperms, fopen, opendir, phpinfo, phpversion, posix_getpwuid, posix_getgrgid, posix_uname,   . ;  error_reporting = E_ALL & ~ E_NOTICE
      
      







必要に応じて、PHPの残りの設定を行いますこのテーマに関するネットワーク上のマニュアルは多数あります。



SSH構成については考慮しませんが、ファイアウォールに焦点を当てます。 Debianはデフォルトですべての接続を許可します。



ファイルmy.iptables.rulesを作成します

 nano /etc/my.iptables.rules
      
      





 *filter -A INPUT -i lo -j ACCEPT -AINPUT -d 127.0.0.0/8 -jREJECT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A OUTPUT -j ACCEPT -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT -A INPUT -p tcp --dport 20 -j ACCEPT -A INPUT -p tcp --dport 21 -j ACCEPT -A INPUT -p tcp --dport 50000 -j ACCEPT -A INPUT -p tcp --dport 60000 -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT
      
      







ルールをアクティブ化して保存します。

 iptables-restore < /etc/my.iptables.rules iptables-save > /etc/iptables.rules
      
      







iptables –Lコマンドで確認します



ダウンロードをファイル/ etc / network / interfacesに登録します

 nano /etc/network/interfaces
      
      







iface lo inet loopback addの後

 pre-up iptables-restore < /etc/iptables.rules
      
      







VPSを保存して再起動します。



All Articles