小さなもののためにDebian / Ubuntuサーバーをブースト

みなさんこんにちは。 最近、debian 7でVPSを控えめなお金で調達する必要がありました。

ここで、鐘をつけて踊ることについて詳しく説明したいと思います。

この投稿のすべてがインターネット上で収集され、最終決定され、噛まれ、1つの記事にまとめられました。





低価格とこのお金の安定性のために、選択はhttps://account.nt-vps.ru/register/に落ちました(ただし、2日間はネットワークに重大な問題がありました)。 VPSは、ディスク上に128MBと10GBの小さなRAM構成で1日5ルーブル(または1か月あたり150ルーブル)で取得されました。



Debian 7.0 x86-64 Wheezyが自動的にインストールされ、VPSの準備が整いました。

64ビットシステムは個人的なニーズにのみ選択されましたが、このVPSにx86をインストールすることをお勧めします。







開始する



サーバーを作成すると、次のようなメールが届きます。

こんにちは



仮想サーバー:vps3456

構成:1xAMD-Opteron / 128Mb / 10Gb / 1xIPv4 @ 100

オペレーティングシステム:Debian 7.0 x86-64 Wheezy



ssh2を介したサーバーへのアクセス:

IP:93.189.xx.xx

ポート:22

ユーザー:root

パスワード:xxxxxxxxxxx



puttyを使用してサーバーに接続する

ssh2プロトコル経由https://www.putty.org/



よろしく

技術サポート


あなたが窓を持っているなら、手紙の指示に謙虚に従い、さらなる指示のためにリンクhttps://www.putty.org/をたどってくださいあなたがLinux(Debian / Ubuntuなど)を持っているなら、私たちはこのようにサーバーに接続します:

$ ssh root@93.189.xx.xx -p 22
      
      





主要なセキュリティシステムダイアログを取得するもの:

 The authenticity of host '[93.189.xx.xx]:22 ([93.189.xx.xx]:22)' can't be established. ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)?
      
      





同意し、yesと書き込みます。

おめでとうございます、あなたはシステムにいます。

更新しましょう:

 # apt-get update && apt-get dist-upgrade -y
      
      







ルートthの下に座らないでください!



デフォルトでは、rootとして座るように招待されていますが、これはセキュリティ上の理由からあまり良くありません。



1.作業を行うユーザーを作成します(最も簡単な方法):

 # adduser user
      
      





userはユーザー名です

次に、次のようなダイアログが表示されます。

   «user» ...    «user» (1001) ...    «user» (1001)   «user» ...    «/home/user» ...    «/etc/skel» ...    UNIX:     UNIX: passwd:        user      ENTER        []:   []:   []:   []:  []:   ? [Y/n] Y
      
      





複雑なパスワードを作成します(忘れないでしょう!)そして、必要と思われるデータを入力するか、単にEnterキーを押します。



2.ユーザーにsudoの実行を許可する

ユーザーを特別なsudoグループに追加します。

 # usermod -a -G sudo user
      
      





ここで、userはユーザー名です。

以上で、ユーザーとしてログインしてログインできます

 $ ssh user@93.189.xx.xx -p 22
      
      





ルート権限が必要な場合は引き続きsudoを使用します



SSHを少し保護する



サーバーを起動した直後に、疑わしいアクティビティに気づきました anu .. ポート22で。明らかに、中国のポルノスキャナーがにおいを嗅ぎ、パスワードを解読し始めたようです。

最も簡単な方法は、sshポートを22から他のポートに変更することです。

1.これを行うには、sshサーバー構成ファイルを開きます。

 $ sudo nano /etc/ssh/sshd_config
      
      





「ポート22」という文字列を検索し、「ポート354」に置き換えます。ここで、354は1〜65535の任意の数字です

念のため、開いているポートを見てみましょう。

 netstat -tupln | grep LISTEN
      
      





このリストからではないものを選択してください。

ポート80、443、3306、22、21、8080、ポート80-443を使用しないことをお勧めします。

2.次に、接続するアドレスの種類(IPv6またはIPv4)を制限します。 サーバーがIPv6を使用していない場合は、ファイル/ etc / ssh / sshd_configを追加します。

 AddressFamily inet
      
      





3.ルートとしての許可を拒否し、PermitRootLoginファイルを調べて、noを設定します。 このパラメーターが存在しない場合は、次を追加します。

 PermitRootLogin no
      
      





4.特定のログインによる接続のみを許可し、ファイル/ etc / ssh / sshd_configを追加します。

 AllowUsers user
      
      





ユーザーのリストはスペースで書かれています。



5.空のパスワードでのログイン試行を禁止します。 PermitEmptyPasswordsを探し、noを設定します

 PermitEmptyPasswords no
      
      





6. sshデーモンを保存して再起動します。

 $ sudo /etc/init.d/ssh restart
      
      





まず、新しいパラメーター($ ssh user@93.189.xx.xx -p 354)でログインし、記事でセキュリティの問題に戻ります。



SWAPインストール



自動モードで判明したように、 スワップは設定されておらず、そのようなメモリサイズでは重要です。

注意! これは私の特定のケースです。次のようなスワップがあるかどうかを確認できます。

 $ sudo swapon -s
      
      







ddを使用して、スワップ領域に必要なサイズのファイルを作成します。/swapはファイルの名前とパス、count = 1024Kはそのサイズ、この場合は512 MBです。

(通常の式はswap = ram * 1.5ですが、これはそうではありません):

 $ sudo dd if=/dev/zero of=/swap bs=1024 count=512K
      
      







次に、カーネルがページファイルを操作するために使用するファイルシステム情報の先頭に書き込みます。

 $ sudo mkswap /swap
      
      







操作が完了すると、次のようになります。

      1,  = 536868   , UUID=54c60583-e61a-483a-a15c-2f1be966db85
      
      







次のステップは、新しく作成されたSWAPファイルをアクティブにすることです。

 $ sudo swapon /swap
      
      







次に、システムの次回起動時にfstabファイルを編集してスワップを接続する必要があります。

 $ sudo echo "/swap swap swap defaults 0 0" | sudo tee -a /etc/fstab
      
      





以上で、スワップの準備ができました。

コマンドで確認:

 $ free
      
      





受け取る必要があります:

  total used free shared buffers cached Mem: 510116 502320 7796 4380 1212 452548 -/+ buffers/cache: 48560 461556 Swap: 524284 0 524284
      
      







NGINXのインストールと高度な構成



フロントエンドとして、よく知られているnginxを使用します。

Webアプリケーションにサーバーを使用しない場合は、この部分をスキップできます。



もちろん、標準のリポジトリにはすでにnginxがありますが、私はこのバージョンをより新鮮で踊らないで欲しいです。

1.ファイル/etc/apt/sources.listを変更します。

 $ sudo nano /etc/apt/sources.list
      
      





そして一番下に追加します:

 deb http://nginx.org/packages/debian/ wheezy nginx deb-src http://nginx.org/packages/debian/ wheezy nginx
      
      





7以外のdebianがある場合、wheezyの代わりにそのコード名を書きます。



2.パッケージソースを更新し、nginxをインストールします。

 $ sudo apt-get update && sudo apt-get install nginx
      
      





3. nginx.confファイルの先頭に新しいパラメーターを追加します

 timer_resolution 100ms; #      ,        worker_rlimit_nofile 8192; #       (RLIMIT_NOFILE)    worker_priority -5;#      
      
      





4. worker_processesを探して、プロセッサコアの数で数値を設定します(この場合は1)。

 worker_processes 1;
      
      





5.イベントディレクティブを探して確認します。

 events { worker_connections 2048; use epoll; }
      
      





6. httpディレクティブを編集し、次のパラメーターを変更または追加します。

 sendfile on; #      #     gzip on; gzip_min_length 1100; gzip_buffers 64 8k; gzip_comp_level 3; gzip_http_version 1.1; gzip_proxied any; gzip_types text/plain application/xml application/x-javascript text/css; #       client_body_timeout 10; #       client_header_timeout 10; # ,    keep-alive          keepalive_timeout 5 5; #      send_timeout 10;
      
      





7. /etc/nginx/conf.d/sitename.confまたは(ubuntu)/etc/nginx/sites-available/sitename.confを編集します。sitenameはサイトの名前になります。

 $ sudo nano /etc/nginx/conf.d/sitename.conf
      
      





私たちはこのフォームに持ってきます:

 #     limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { listen 80; #    server_name sitename.net www.sitename.net; #         client_body_buffer_size 1K; #         client_header_buffer_size 1k; #     ,    Content-Length .      ,     client_max_body_size 1k; #           large_client_header_buffers 2 1k; #    if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } #  access_log /var/log/nginx/sitename.access.log main; #    error_log /var/log/nginx/sitename.error.log main; #     charset utf-8; location / { #   (slimits),      .   1     32000 ,      5  limit_conn perip 10; limit_conn perserver 100; #        #    ( )   ! if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl|msnbot|scrapbot) { return 403; } #  referer . (     )       if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen|pron|money|free|jwh|speed|test|cash|xxx) ) { return 403; } #     location /   } }
      
      





記事の後半でこれらの設定に戻ります。



システム変数を選択し、ある種の攻撃から身を守ります



これらのパラメーターは油性を与え、場合によっては負荷を増加させます。

/etc/sysctl.confの編集

 $ sudo nano /etc/sysctl.conf
      
      





最後に追加

 #   smurf- net.ipv4.icmp_echo_ignore_broadcasts = 1 #    ICMP- net.ipv4.icmp_ignore_bogus_error_responses = 1 #   SYN- net.ipv4.tcp_syncookies = 1 #     net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 #    net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 #   ,     net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 #  ExecShield          kernel.exec-shield = 1 kernel.randomize_va_space = 1 #     net.ipv4.ip_local_port_range = 2000 65000 #    TCP- net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_window_scaling = 1 #  (. "   ") vm.swappiness=10
      
      





これで再起動できます



システム全体のパフォーマンスを高速化



プリリンクとプリロード。 静的ライブラリアドレスを作成するためのPrelink、Preloadは、最も頻繁に使用されるアプリケーションのファイルを監視し、システムがアイドル状態のときにそれらをメモリにロードする小さなアプリケーションです。

1. Prelinkのインストール:

 $ sudo apt-get -y install prelink
      
      





ファイル/ etc / default / prelinkを編集します。

 $ sudo nano /etc/default/prelink
      
      





行をPRELINKING = unknownからPRELINKING = yesに変更します

以下を開始します。

 $ sudo /etc/cron.daily/prelink
      
      





2.プリロードのインストール:

 $ sudo apt-get -y install preload
      
      





すべて、他に何も必要ありません



ファイアウォールを構成する(ファイアウォール)



さらに、非常に疑わしい構成があります。 1つのIPアドレスからの接続数を構成します。

いくつかの種類のDOS攻撃とブルートフォースで節約します。



私たちは実施します:

 $ sudo iptables -A INPUT -p tcp --dport 80 -i eth0 \ -m state --state NEW -m recent --set
      
      





さらに:

 $ sudo iptables -A INPUT -p tcp --dport 80 -i eth0 \ -m state --state NEW -m recent --update \ --seconds 15 --hitcount 20 -j DROP
      
      





このルールは、1つのIPアドレスから15秒以内にポート80(ウェブ)への20以上の接続を制限します。

(ところで、同様のルールはnginxレベルですでに設定されていますが、膨大な量のリソースを消費します)



 $ sudo iptables -A INPUT -p tcp --dport 354 -i eth0 \ -m state --state NEW -m recent --set
      
      







 $ sudo iptables -A INPUT -p tcp --dport 354 -i eth0 \ -m state --state NEW -m recent --update \ --seconds 60 --hitcount 4 -j DROP
      
      





sshサーバーの354ポートはどこにありますか。 ルールは接続数を制限し、1分間に4接続を超えないようにします。 実際、1分間に1回以上許可することはできませんでした。

さらに、このルールを自分自身や他のサービスにさらに適合させることができます。



システムを再起動すると、すべてのルールがゼロにリセットされるため、次のことを行います。

ファイル/etc/network/if-up.d/00-iptablesを作成および編集します

 $ sudo nano -w /etc/network/if-up.d/00-iptables
      
      





書き込みます:

 #!/bin/sh iptables-restore < /etc/firewall.conf
      
      





ファイルを保存して実行可能にします:

 $ sudo chmod +x /etc/network/if-up.d/00-iptables
      
      





ルールをファイルに保存します。

 $ sudo iptables-save | sudo tee /etc/firewall.conf
      
      





すべて、ルールが設定され、システムの再起動後も残ります。



これで最初の部分は終わり、自由時間が来ました。



次のパートでは、nginxをnode.jsにプロキシする、node.jsをインストールして構成する、php-fpmをインストールしてnginxに接続することについて説明します。 +不要なダンスなしの速度と安全性に関するヒント。



PSこれはHabréに関する私の最初の投稿であり、高度なdebianセットアップの最初の経験の1つです。 批判や訂正を聞いてうれしいです。



upd: habra-peopleの批判、修正、アドバイス、および反応性に感謝します。 次の記事にあなたのアドバイスを補足します。

upd 04/19/16:記事を少し編集し、エラーを修正し、いくつかの場所で補足しました。 debian 8.1でチェック-動作します。 n回目に延期された新しい記事...



2018年12月10日更新:サービスが分割されました。 記事内のリンクが更新されました



All Articles