How-To-Secure-A-Linux-Server - Linux サーバーを保護するための進化するハウツー ガイド。

(An evolving how-to guide for securing a Linux server.)

Created at: 2019-02-09 14:44:37
Language: NULL
License: CC-BY-SA-4.0

Linux サーバーを保護する方法

Linux サーバーを保護するための進化するハウツー ガイドであり、できればセキュリティとその重要性についても少し説明します。

CC-BY-SA

目次

( nGitHubTOCで作ったTOC )

序章

ガイドの目的

このガイドの目的は、Linux サーバーを保護する方法を説明することです。

Linux サーバーを保護するためにできることはたくさんあります。このガイドでは、できる限り多くのことを取り上げます。私が学ぶにつれて、または人々が貢献するにつれて、より多くのトピック/資料が追加されます.

目次

サーバーを保護する理由

このガイドを使用しているのは、優れたセキュリティが重要である理由を既に理解していることを願っています. これはそれ自体が重要なトピックであり、それを分解することはこのガイドの範囲外です。その質問に対する答えがわからない場合は、まず調べてみることをお勧めします。

大まかに言えば、サーバーなどのデバイスがパブリック ドメインにあると、つまり外部から見えるようになると、悪意のある行為者の標的になります。セキュリティで保護されていないデバイスは、データにアクセスしたり、サーバーを大規模な DDOS 攻撃の別のノードとして使用したりする悪意のある攻撃者の遊び場です。

さらに悪いことに、適切なセキュリティがなければ、サーバーが危険にさらされているかどうかわからない可能性があります. 悪意のある人物がサーバーへの不正アクセスを取得し、何も変更せずにデータをコピーした可能性があるため、それを知ることはできません. または、サーバーが DDOS 攻撃の一部であった可能性がありますが、それはわかりません。ニュースで取り上げられている大規模なデータ侵害の多くを見てください。企業は、多くの場合、悪意のある人物がいなくなってからずっと後になるまで、データの漏洩や侵入に気付きませんでした。

一般に信じられていることとは反対に、悪意のある人物は、お金のために何かを変更したり、データからあなたを締め出したりすることを常に望んでいるわけではありません。場合によっては、サーバー上のデータをデータ ウェアハウスに使用したり (ビッグ データには大金がかかります)、悪意のある目的でサーバーを密かに使用したりすることもあります。

目次

なぜさらに別のガイド

Linux を保護する方法を説明する無数の記事がオンラインにあるため、このガイドは重複していたり​​不要であると思われるかもしれませんが、情報はさまざまな記事に分散しており、さまざまな内容や方法でカバーされています。何百もの記事を精査する時間があるのは誰ですか?

Debian ビルドの調査を行っていたとき、メモを取りました。最後に、私がすでに知っていることと、私が学んでいることに加えて、ハウツー ガイドの作成があることに気付きました。私はそれをオンラインに掲載して、うまくいけば他の人が学び時間を節約できるようにしようと考えました。

すべてをカバーする 1 つのガイドを見つけたことはありません。このガイドは私の試みです。

このガイドで説明する内容の多くは基本的/些細なことかもしれませんが、ほとんどの人は毎日 Linux をインストールするわけではなく、基本的なことを忘れがちです。

AnsibleChefJenkinsPuppetなどのIT 自動化ツールは、サーバーのインストール/構成という面倒な作業に役立ちますが、複数または大規模な展開に適しています。私見、これらの種類の自動化ツールを使用するために必要なオーバーヘッドは、家庭用の1回限りの単一サーバーのインストールにはまったく不要です.

目次

その他のガイド

専門家、業界のリーダー、およびディストリビューション自体によって提供される多くのガイドがあります。これらのガイドのすべてを含めることは実際的ではなく、著作権に反することもあります。このガイドを開始する前に、それらを確認することをお勧めします。

目次

すること/追加すること

目次

ガイドの概要

このガイドについて

このガイド...

  • ...進行中の作業です。
  • ...在宅Linux サーバー焦点を当てています。ここに記載されているすべての概念/推奨事項は、より大規模な/プロフェッショナルな環境に適用されますが、これらのユース ケースでは、このガイドの範囲外である、より高度で特殊な構成が必要になります。
  • ... Linux、 Linux のインストール方法、または使用方法については教えていません。Linux を初めて使用する場合は、https://linuxjourney.com/を確認してください。
  • ... Linux ディストリビューションに依存しないこと意図しています。
  • ...セキュリティについて知っておくべきことをすべて教えているわけではなく、システム/サーバーのセキュリティのすべての側面に触れているわけでもありません。たとえば、物理的なセキュリティはこのガイドの範囲外です。
  • ...プログラム/ツールがどのように機能するかについて語らず、隅々まで掘り下げません。このガイドで参照するプログラム/ツールのほとんどは、非常に強力で高度な構成が可能です。目標は、最低限の必需品をカバーすることです。食欲をそそり、もっと知りたいと思うほど空腹にさせるのに十分です。
  • ...は、コピー アンド ペーストできるコードを提供することで、簡単にすることを目的としています。貼り付ける前にコマンドを変更する必要がある場合があるため、お気に入りのテキスト エディターを手元に置いておいてください。
  • ...私にとって論理的に意味のある順序編成されています-つまり、ファイアウォールをインストールする前にSSHを保護します。そのため、このガイドは記載されている順序に従うことを意図していますが、そうする必要はありません。異なる順序で行う場合は注意してください。一部のセクションでは、前のセクションを完了する必要があります。

目次

私のユースケース

多くの種類のサーバーとさまざまなユースケースがあります。このガイドはできるだけ一般的なものにしたいと考えていますが、すべての/その他のユースケースには当てはまらないことがあります。このガイドを読むときは、最善の判断を下してください。

このガイドで取り上げるトピックの多くに文脈を当てはめるのを助けるために、私のユースケース/構成は次のとおりです。

  • デスクトップクラスのコンピューター...
  • 単一の NIC で...
  • 民生用ルーターに接続...
  • ISP から提供された動的 WAN IP を取得しています...
  • IPV4のWAN+LANで...
  • そしてNATを使ったLAN ...
  • 未知のコンピューターや未知の場所 (つまり、友人の家) からリモートで SSH 接続できるようにしたい。

目次

構成ファイルの編集 - 怠け者向け

私はとても怠け者で、必要がなければ手作業でファイルを編集するのは好きではありません。他の人も私と同じだと思います。:)

code
そのため、可能な場合は、構成ファイルの行を追加または変更するなど、必要なことをすばやく行うためのスニペットを提供しました。

code
スニペットは、、、、、などの
echo
基本
cat
的なコマンド
sed
を使用
awk
します
grep
code
各コマンド/パーツの機能と同様に、スニペットがどのように機能するかは、このガイドの範囲外です
man
。ページはあなたの友達です。

:

code
スニペットは、変更が行われたことを検証/検証しません。つまり、行が実際に追加または変更されました。検証部分はあなたの有能な手に委ねます。このガイドの手順には、変更されるすべてのファイルのバックアップを取ることが含まれます。

code
すべての変更をスニペットで自動化できるわけではありません。これらの変更には、古き良き手動編集が必要です。たとえば、INIタイプのファイルに行を追加することはできません。お気に入りのLinux テキスト エディターを使用します。

目次

貢献する

コラボレーションを容易にするために、このガイドをGitHubに置きたいと思いました。貢献する人が多ければ多いほど、このガイドはより良く、より完全なものになります。

貢献するには、プル リクエストをフォークして送信するか、新しい問題を送信します。

目次

始める前に

あなたの原則を特定する

始める前に、あなたの原則が何であるかを確認したいと思うでしょう。あなたの脅威モデルは何ですか? 考慮すべき点:

  • なぜサーバーを保護したいのですか?
  • どの程度のセキュリティが必要ですか、または必要ありませんか?
  • セキュリティのためにどの程度の利便性を妥協しても構わないと思っていますか? またその逆も同様です?
  • 保護したい脅威は何ですか? あなたの状況の詳細は何ですか?例えば:
    • サーバー/ネットワークへの物理的なアクセスは攻撃ベクトルになる可能性がありますか?
    • 家の外からサーバーにアクセスできるように、ルーターのポートを開きますか?
    • デスクトップクラスのマシンにマウントされるサーバーでファイル共有をホストしますか? デスクトップ マシンが感染し、それがサーバーに感染する可能性はどのようなものですか?
  • セキュリティの実装によって自分のサーバーからロックアウトされた場合、回復する手段はありますか? たとえば、ルート ログインまたはパスワードで保護された GRUBを無効にしました。

これらは、考えるべきことのほんの一部です。サーバーの保護を開始する前に、何を保護しようとしているのか、またその理由を理解して、何をする必要があるかを理解する必要があります。

目次

Linux ディストリビューションの選択

このガイドはディストリビューションに依存しないことを意図しているため、ユーザーは任意のディストリビューションを使用できます。そうは言っても、留意すべき点がいくつかあります。

ディストリビューションが欲しい...

  • ・・・安定しています。午前 2 時に問題をデバッグするのが好きでない限り、無人アップグレードや手動のパッケージ/システム アップデートによってサーバーが動作不能になることは望ましくありません。しかし、これはまた、最新の最高の最先端ソフトウェアを実行しなくても大丈夫であることを意味します。
  • ...セキュリティ パッチで最新の状態を維持します。サーバー上のすべてを保護できますが、実行しているコア OS やアプリケーションに既知の脆弱性がある場合、決して安全ではありません。
  • おなじみですね。Linux を知らない場合は、Linux を保護する前に試してみることをお勧めします。ソフトウェアのインストール方法、構成ファイルの場所など、慣れ親しんでいる必要があります...
  • ・・・しっかりサポート。最も熟練した管理者でさえ、時々助けが必要です。助けを求める場所があると、あなたの正気が保たれます。

目次

Linux のインストール

Linux のインストールは、ディストリビューションごとに方法が異なり、通常、インストール手順は十分に文書化されているため、このガイドの範囲外です。ヘルプが必要な場合は、ディストリビューションのドキュメントから始めてください。ディストリビューションに関係なく、大まかなプロセスは通常次のようになります。

  1. ISOをダウンロードする
  2. インストールメディア (CD や USB スティックなど) に書き込み/コピー/転送します。
  3. インストールメディアからサーバーを起動します
  4. プロンプトに従ってインストールします

該当する場合は、エキスパート インストール オプションを使用して、サーバーで実行されているものをより厳密に制御できるようにします。絶対に必要なものだけをインストールしてください。個人的には、SSH 以外はインストールしていません。また、ディスク暗号化オプションにチェックマークを付けます。

目次

インストール前後の要件

  • 外部からサーバーにアクセスできるようにルーターのポートを開いている場合は、システムが起動して安全になるまでポート転送を無効にします。
  • サーバーに物理的に接続してすべてを実行している場合を除き、リモート アクセスが必要になるため、SSH が機能することを確認してください。
  • システムを最新の状態に保ちます (つまり
    sudo apt update && sudo apt upgrade
    、Debian ベースのシステム)。
  • 次のようなセットアップに固有のタスクを必ず実行してください。
    • ネットワークの構成
    • でのマウント ポイントの構成
      /etc/fstab
    • 初期ユーザー アカウントの作成
    • 好きなコアソフトウェアをインストールする
      man
    • 等...
  • 重要なセキュリティ アラートを受け取るには、サーバーで電子メールを送信できる必要があります。メールサーバーを設定していない場合は、Gmail と Exim4 As MTA With Implicit TLS を確認してください。
  • また、このガイドを開始する前に、 CIS ベンチマークを確認することをお勧めします。

目次

その他の重要事項

  • このガイドは、Debian で作成およびテストされています。以下のほとんどのものは、他のディストリビューションでも動作するはずです。そうでないものを見つけた場合は、私に連絡してください。各ディストリビューションを分ける主な要素は、パッケージ管理システムです。私は Debian を使用しているので、すべてのDebian ベースのディストリビューション
    apt
    で動作する適切なコマンドを提供します。他のディストリビューション用のコマンドを提供してくれる人がいれば、追加します。
  • ファイル パスと設定も若干異なる場合があります。問題がある場合は、ディストリビューションのドキュメントを確認してください。
  • 開始する前にガイド全体をお読みください。ユースケースおよび/またはプリンシパルは、何かをしないこと、または順序を変更することを要求する場合があります。
  • 何を貼り付けているのかを理解せずに、やみくもにコピー アンド ペーストしないでください。一部のコマンドは、動作させる前に必要に応じて変更する必要があります (ユーザー名など)。

目次

SSH サーバー

SSH を変更する前の重要な注意事項

SSH 構成の変更を行って適用する前に、サーバーに対して 2 つ目のターミナルを開いたままにしておくことを強くお勧めします。このようにして、最初の端末セッションから自分自身をロックアウトしても、まだ 1 つのセッションが接続されているため、修正できます。

このアイデアを提供してくれたSonnenbrandに感謝します。

SSH 公開鍵/秘密鍵

どうして

SSH 公開/秘密鍵を使用すると、パスワードを使用するよりも安全です。また、パスワードを入力する必要がないため、サーバーへの接続がより簡単かつ迅速になります。

使い方

詳細については、以下の参考文献を確認してください。大まかに言えば、公開鍵/秘密鍵は、鍵のペアを使用して身元を確認することによって機能します。

  1. 公開鍵という 1 つの鍵は、データの暗号化のみを行うことができ、復号化はできません。
  2. もう 1 つの鍵である秘密鍵は、データを復号化できます。

SSH の場合、公開鍵と秘密鍵がクライアントで作成されます。両方のキー、特に秘密キーを安全に保つ必要があります。公開鍵は公開されることを意図していますが、どちらの鍵も悪人の手に渡らないようにすることが賢明です。

SSH サーバーに接続すると、SSH は、接続先のサーバー上のファイルで、接続元のクライアントに一致する公開鍵を探します

~/.ssh/authorized_keys
。ファイルは、接続しようとしている IDのホーム フォルダーにあることに注意してください。そのため、公開鍵を作成したら、それを に追加する必要があります
~/.ssh/authorized_keys
。1 つの方法は、それを USB スティックにコピーし、物理的にサーバーに転送することです。もう 1 つの方法は、use を使用
ssh-copy-id
して公開鍵を転送および追加することです。

キーが作成され、公開キーが

~/.ssh/authorized_keys
ホストに追加されると、SSH は公開キーと秘密キーを使用して身元を確認し、安全な接続を確立します。身元を確認する方法は複雑なプロセスですが、Digital Oceanはその仕組みについて非常に優れた記事を書いています。大まかに言えば、ID は、サーバーがチャレンジ メッセージを公開鍵で暗号化し、それをクライアントに送信することによって検証されます。クライアントが秘密鍵を使用してチャレンジ メッセージを復号化できない場合、ID を検証できず、接続が確立されません。

SSH 接続を確立するには秘密鍵が必要なため、より安全であると見なされます。で設定

PasswordAuthentication no
した
/etc/ssh/sshd_config
場合、SSH は秘密鍵なしでは接続できません。

公開鍵/秘密鍵を使用して接続するときに鍵のパスフレーズを入力する必要がある鍵のパスフレーズを設定することもできます。これを行うと、スクリプトでパスフレーズを送信する方法がなくなるため、自動化にキーを使用できないことを意味することに注意してください。

ssh-agent
は、多くの Linux ディストリビューションに同梱されている (通常は既に実行されている) プログラムであり、暗号化されていない秘密鍵を構成可能な期間メモリに保持できるようにします。実行するだけ
ssh-add
で、パスフレーズの入力を求められます。構成可能な期間が経過するまで、パスフレーズの再入力を求められることはありません。

https://linux-audit.com/によると、Ed25519 キーを使用します。

ECDSA や DSA よりも優れたセキュリティを提供する楕円曲線署名スキームを使用しています。同時に、優れたパフォーマンスも備えています。

目標

  • Ed25519 公開/秘密 SSH キー:
    • クライアントの秘密鍵
    • サーバー上の公開鍵

ノート

  • サーバーに接続するすべてのコンピューターとアカウントに対して、この手順を実行する必要があります。

参考文献

手順

  1. サーバーへの接続に使用するコンピューターから、サーバー自体ではなくクライアントが次のコードでEd25519キーを作成し

    ssh-keygen
    ます。

    ssh-keygen -t ed25519
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/home/user/.ssh/id_ed25519):
    Created directory '/home/user/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/user/.ssh/id_ed25519.
    Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
    The key fingerprint is:
    SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client
    The key's randomart image is:
    +--[ED25519 256]--+
    |xxxx  x          |
    |o.o +. .         |
    | o o oo   .      |
    |. E oo . o .     |
    | o o. o S o      |
    |... .. o o       |
    |.+....+ o        |
    |+.=++o.B..       |
    |+..=**=o=.       |
    +----[SHA256]-----+
    

    : パスフレーズを設定すると、このキーを使用してサーバーに接続するたびにパスフレーズを入力する必要があります

    ssh-agent

  2. ここで、クライアントからの公開鍵をサーバー上のファイルに追加する必要があります。私たちはまだ LAN 上の自宅にいる可能性が高いため、おそらくMIM攻撃から安全です。したがって、公開鍵を転送して追加するために使用します。

    ~/.ssh/id_ed25519.pub
    ~/.ssh/authorized_keys
    ssh-copy-id

    ssh-copy-id user@server
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
    The authenticity of host 'host (192.168.1.96)' can't be established.
    ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    user@host's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'user@host'"
    and check to make sure that only the key(s) you wanted were added.
    

ここで、セットアップに固有のタスクを実行してください

目次

AllowGroups の SSH グループを作成する

どうして

誰がサーバーに SSH 接続できるかを簡単に制御できるようにするため。グループを使用することで、グループにアカウントをすばやく追加/削除して、サーバーへの SSH アクセスをすばやく許可または許可しないようにすることができます。

使い方

SSH の構成ファイルでAllowGroups オプションを使用して

/etc/ssh/sshd_config
、ユーザーが特定の UNIX グループのメンバーである場合にのみ SSH 接続を許可するように SSH サーバーに指示します。グループに属していない人は、SSH で接続できません。

目標

  • サーバーに SSH 接続できるユーザーを制限するためにSecure
    /etc/ssh/sshd_config
    で使用する UNIX グループ

ノート

参考文献

  • man groupadd
  • man usermod

手順

  1. グループを作成します。

    sudo groupadd sshusers
  2. グループにアカウントを追加します。

    sudo usermod -a -G sshusers user1
    sudo usermod -a -G sshusers user2
    sudo usermod -a -G sshusers ...

    SSH アクセスが必要なサーバー上のすべてのアカウントに対して、これを行う必要があります。

目次

安全
/etc/ssh/sshd_config

どうして

SSH はサーバーへの扉です。これは、ルーターのポートを開いて、ホーム ネットワークの外部からサーバーに SSH 接続できる場合に特に当てはまります。適切に保護されていない場合、悪意のある人物がそれを使用してシステムへの不正アクセスを取得する可能性があります。

使い方

/etc/ssh/sshd_config
SSH サーバーが使用するデフォルトの構成ファイルです。このファイルを使用して、SSH サーバーが使用するオプションを指定します。

目標

  • 安全な SSH 構成

ノート

参考文献

手順

  1. OpenSSH サーバーの構成ファイルのバックアップを作成

    /etc/ssh/sshd_config
    し、読みやすくするためにコメントを削除します。

    sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
    sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
  2. 編集

    /etc/ssh/sshd_config
    してから、構成/セットアップに関係なく適用する必要があるこれらの設定を見つけて編集または追加します。

    : SSH は矛盾する設定の重複を好みません。たとえば、

    ChallengeResponseAuthentication no
    and thenがある場合
    ChallengeResponseAuthentication yes
    、SSH は最初のものを尊重し、2 番目のものを無視します。ファイル
    /etc/ssh/sshd_config
    には、以下の設定/行の一部が既に含まれている場合があります。問題を回避するには、
    /etc/ssh/sshd_config
    ファイルを手動で調べて、重複する矛盾する設定に対処する必要があります。

    ########################################################################################################
    # start settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
    ########################################################################################################
    
    # Supported HostKey algorithms by order of preference.
    HostKey /etc/ssh/ssh_host_ed25519_key
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    
    KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
    
    Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
    
    MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
    
    # LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
    LogLevel VERBOSE
    
    # Use kernel sandbox mechanisms where possible in unprivileged processes
    # Systrace on OpenBSD, Seccomp on Linux, seatbelt on MacOSX/Darwin, rlimit elsewhere.
    # Note: This setting is deprecated in OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
    # UsePrivilegeSeparation sandbox
    
    ########################################################################################################
    # end settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
    ########################################################################################################
    
    # don't let users set environment variables
    PermitUserEnvironment no
    
    # Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
    Subsystem sftp  internal-sftp -f AUTHPRIV -l INFO
    
    # only use the newer, more secure protocol
    Protocol 2
    
    # disable X11 forwarding as X11 is very insecure
    # you really shouldn't be running X on a server anyway
    X11Forwarding no
    
    # disable port forwarding
    AllowTcpForwarding no
    AllowStreamLocalForwarding no
    GatewayPorts no
    PermitTunnel no
    
    # don't allow login if the account has an empty password
    PermitEmptyPasswords no
    
    # ignore .rhosts and .shosts
    IgnoreRhosts yes
    
    # verify hostname matches IP
    UseDNS yes
    
    Compression no
    TCPKeepAlive no
    AllowAgentForwarding no
    PermitRootLogin no
    
    # don't allow .rhosts or /etc/hosts.equiv
    HostbasedAuthentication no
    
  3. 次に、これらの設定を見つけて編集または追加し、要件に従って値を設定します。

    設定 有効な値 説明 ノート
    グループを許可 ローカル UNIX グループ名
    AllowGroups sshusers
    SSH アクセスを許可するグループ
    ClientAliveCountMax 番号
    ClientAliveCountMax 0
    応答なしで送信されたクライアント アライブ メッセージの最大数
    ClientAliveInterval 秒数
    ClientAliveInterval 300
    応答要求前のタイムアウト (秒)
    リッスンアドレス スペースで区切られたローカル アドレスのリスト
    • ListenAddress 0.0.0.0
    • ListenAddress 192.168.1.100
    ローカルアドレス
    sshd
    はリッスンする必要があります
    重要な詳細については、 Issue #1を参照してください。
    ログイン猶予時間 秒数
    LoginGraceTime 30
    ログインがタイムアウトするまでの秒数
    MaxAuthTries 番号
    MaxAuthTries 2
    ログインの最大許容試行回数
    最大セッション数 番号
    MaxSessions 2
    開いているセッションの最大数
    MaxStartups 番号
    MaxStartups 2
    ログイン セッションの最大数
    パスワード認証
    yes
    また
    no
    PasswordAuthentication no
    パスワードによるログインが許可されている場合
    ポート 開いている/利用可能なポート番号
    Port 22
    sshd
    リッスンするポート

    man sshd_config
    これらの設定の意味の詳細を確認してください。

  4. 互いに矛盾する重複した設定がないことを確認してください。以下のコマンドには出力がありません。

    awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
  5. ssh を再起動します。

    sudo service sshd restart
  6. 構成が機能したこと

    sshd -T
    を確認し、出力を確認できます。

    sudo sshd -T
    port 22
    addressfamily any
    listenaddress [::]:22
    listenaddress 0.0.0.0:22
    usepam yes
    logingracetime 30
    x11displayoffset 10
    maxauthtries 2
    maxsessions 2
    clientaliveinterval 300
    clientalivecountmax 0
    streamlocalbindmask 0177
    permitrootlogin no
    ignorerhosts yes
    ignoreuserknownhosts no
    hostbasedauthentication no
    ...
    subsystem sftp internal-sftp -f AUTHPRIV -l INFO
    maxstartups 2:30:2
    permittunnel no
    ipqos lowdelay throughput
    rekeylimit 0 0
    permitopen any
    

目次

短い Diffie-Hellman キーを削除する

どうして

OpenSSH 6.7+に関する Mozilla の OpenSSH ガイドラインによると、「使用中のすべての Diffie-Hellman モジュールは、少なくとも 3072 ビットの長さである必要があります」。

Diffie-Hellman アルゴリズムは、安全な接続を確立するために SSH によって使用されます。モジュライ (鍵のサイズ) が大きいほど、暗号化は強力になります。

目標

  • 長さが 3072 ビット未満のすべての Diffie-Hellman キーを削除します

参考文献

手順

  1. SSH の moduli ファイルのバックアップを作成します

    /etc/ssh/moduli

    sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
  2. 短弾性率を削除します。

    sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
    sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli

目次

SSH の 2FA/MFA

どうして

SSH はドアや窓の非常に優れたセキュリティ ガードですが、悪意のある人物が見て、総当たり攻撃を試みることができる目に見えるドアであることには変わりありません。Fail2banはこれらの総当たり攻撃の試みを監視しますが、そのようなことはありません。安全すぎるからです。2 つの要素を要求することで、セキュリティがさらに強化されます。

2 要素認証 (2FA) / 多要素認証 (MFA) を使用すると、入力する人は2 つのキーを入力する必要があるため、悪意のある人物が侵入しにくくなります。2 つのキーは次のとおりです。

  1. パスワード
  2. 30 秒ごとに変化する 6 桁のトークン

両方の鍵がないと、中に入ることができません。

なぜだめですか

多くの人は、その経験が面倒または煩わしいと感じるかもしれません. また、システムへのアクセスは、コードを生成する付属の認証アプリに依存します。

使い方

Linux では、PAM が認証を担当します。https://en.wikipedia.org/wiki/Linux_PAMで読むことができる PAM の 4 つのタスクがあります。このセクションでは、認証タスクについて説明します。

コンソールから直接、または SSH 経由でサーバーにログインすると、通過したドアが PAM の認証タスクに要求を送信し、PAM がパスワードを要求して確認します。各ドアが使用するルールをカスタマイズできます。たとえば、コンソールから直接ログインするときのルール セットと、SSH 経由でログインするときの別のルール セットを設定できます。

このセクションでは、SSH 経由でログインするときの認証規則を変更して、パスワードと 6 桁のコードの両方を要求します。

Google の libpam-google-authenticator PAM モジュールを使用して、TOTPキーを作成および検証します。https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/およびhttps://jemurai.com/2018/10/11/how-it-works-totp-based-mfa / TOTP がどのように機能するかについての非常に優れた記事があります。

ここで行うことは、サーバーの SSH PAM 構成に、ユーザーにパスワードと数値トークンを要求するように指示することです。次に、PAM はユーザーのパスワードを検証し、それが正しい場合は、認証要求を libpam-google-authenticator にルーティングします。libpam-google-authenticator は、6 桁のトークンを要求して検証します。すべてが正常である場合にのみ、認証は成功し、ユーザーはログインを許可されます。

目標

  • すべての SSH 接続で 2FA/MFA が有効

ノート

  • これを行う前に、2FA/MFA がどのように機能するかを理解しておく必要があります。続行するには、携帯電話に認証アプリが必要です。
  • google-authenticator-libpamを使用します。
  • 以下の構成では、ユーザーがパスワードでログオンしている場合にのみ 2FA/MFA コードを入力する必要があり、SSH 公開/秘密キーを使用している場合は必要ありません。要件に合わせてこの動作を変更する方法については、ドキュメントを確認してください。

参考文献

手順

  1. libpam-google-authenticator をインストールします。

    Debian ベースのシステムの場合:

    sudo apt install libpam-google-authenticator
  2. 2FA/MFA を有効にする ID としてログインしていることを確認し実行

    google-authenticator
    して必要なトークン データを作成します。

    google-authenticator
    Do you want authentication tokens to be time-based (y/n) y
    https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost
    
    ...
    
    Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY
    Your verification code is 751419
    Your emergency scratch codes are:
      12345678
      90123456
      78901234
      56789012
      34567890
    
    Do you want me to update your "/home/user/.google_authenticator" file (y/n) y
    
    Do you want to disallow multiple uses of the same authentication
    token? This restricts you to one login about every 30s, but it increases
    your chances to notice or even prevent man-in-the-middle attacks (y/n) Do you want to disallow multiple uses of the same authentication
    token? This restricts you to one login about every 30s, but it increases
    your chances to notice or even prevent man-in-the-middle attacks (y/n) y
    
    By default, tokens are good for 30 seconds. In order to compensate for
    possible time-skew between the client and the server, we allow an extra
    token before and after the current time. If you experience problems with
    poor time synchronization, you can increase the window from its default
    size of +-1min (window size of 3) to about +-4min (window size of
    17 acceptable tokens).
    Do you want to do so? (y/n) y
    
    If the computer that you are logging into isn't hardened against brute-force
    login attempts, you can enable rate-limiting for the authentication module.
    By default, this limits attackers to no more than 3 login attempts every 30s.
    Do you want to enable rate-limiting (y/n) y
    

    これはroot として実行されないことに注意してください。

    すべての質問に対してデフォルトのオプション (ほとんどの場合 y) を選択し、緊急スクラッチ コードを忘れずに保存してください。

  3. PAM の SSH 構成ファイルのバックアップを作成します

    /etc/pam.d/sshd

    sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
  4. 次に、次の行を に追加して、SSH の認証方法として有効にする必要があります

    /etc/pam.d/sshd

    auth       required     pam_google_authenticator.so nullok
    

    :意味はこちらをご確認ください。

    nullok

    怠け者の場合

    echo -e "\nauth       required     pam_google_authenticator.so nullok         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
  5. で次の行を追加または編集して、SSH にそれを利用するように指示し

    /etc/ssh/sshd_config
    ます。

    ChallengeResponseAuthentication yes
    

    怠け者の場合

    sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
    echo -e "\nChallengeResponseAuthentication yes         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
  6. ssh を再起動します。

    sudo service sshd restart

目次

基礎

sudo を使用できるユーザーを制限する

どうして

sudo を使用すると、アカウントはrootを含む他のアカウントとしてコマンドを実行できます。必要なアカウントだけが sudo を使用できるようにしたいと考えています。

目標

  • 指定したグループに属する人に限定された sudo 権限

ノート

  • インストールがすでにこれを行っているか、この目的のための特別なグループがすでにある可能性があるため、最初に確認してください。
    • Debian は sudo グループを作成します
    • RedHat は wheel グループを作成します
  • パスワードを必要としない一部のディストリビューションに関する注意事項については、https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39を参照してください。共有してくれたsbrl
    sudo
    に感謝します。

手順

  1. グループを作成します。

    sudo groupadd sudousers
  2. グループにアカウントを追加します。

    sudo usermod -a -G sudousers user1
    sudo usermod -a -G sudousers user2
    sudo usermod -a -G sudousers  ...

    sudo 権限が必要なサーバー上のすべてのアカウントに対してこれを行う必要があります。

  3. sudo の構成ファイルのバックアップを作成します

    /etc/sudoers

    sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
  4. sudo の構成ファイルを編集します

    /etc/sudoers

    sudo visudo
  5. sudousers
    次の行を追加して、グループ内のユーザーのみに sudo の使用を許可するように sudo に指示します(まだ存在しない場合)。

    %sudousers   ALL=(ALL:ALL) ALL
    

目次

su を使用できるユーザーを制限する

どうして

su はまた、アカウントがrootを含む他のアカウントとしてコマンドを実行できるようにします。必要なアカウントだけが su を使用できるようにしたいと考えています。

目標

  • 指定したグループに属する人に限定された su 権限

参考文献

手順

  1. グループを作成します。

    sudo groupadd suusers
  2. グループにアカウントを追加します。

    sudo usermod -a -G suusers user1
    sudo usermod -a -G suusers user2
    sudo usermod -a -G suusers  ...

    sudo 権限が必要なサーバー上のすべてのアカウントに対してこれを行う必要があります。

  3. このグループのユーザーのみが実行できるようにし

    /bin/su
    ます。

    sudo dpkg-statoverride --update --add root suusers 4750 /bin/su

目次

FireJail を使用してサンドボックスでアプリケーションを実行する

どうして

多くのアプリケーションでは、サンドボックスで実行する方が絶対に優れています。

ブラウザー (さらにクローズド ソースのもの) と電子メール クライアントを強くお勧めします。

目標

  • アプリケーションを監獄 (いくつかの安全なディレクトリ) に閉じ込め、システムの残りの部分へのアクセスをブロックする

参考文献

手順

  1. ソフトウェアをインストールします。

    sudo apt install firejail firejail-profiles

    注: Debian 10 Stable の場合、公式のバックポートが推奨されます。

    sudo apt install -t buster-backports firejail firejail-profiles
  2. アプリケーション (

    /usr/bin
    またはにインストールされている
    /bin
    ) をサンドボックスでのみ実行できるようにします (以下のいくつかの例を参照してください)。

    sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
    sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
    sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
    sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
    sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
  3. 通常どおり (ターミナルまたはランチャー経由で) アプリケーションを実行し、jail で実行されているかどうかを確認します。

    firejail --list
  4. サンドボックス化されたアプリを以前と同じように再び実行できるようにする (例: Firefox)

    sudo rm /usr/local/bin/firefox

目次

NTP クライアント

どうして

多くのセキュリティ プロトコルは時間を活用します。システム時刻が正しくない場合、サーバーに悪影響を及ぼす可能性があります。NTP クライアントは、システム時刻をグローバル NTP サーバーと同期させることで、この問題を解決できます。

使い方

NTP は Network Time Protocol の略です。このガイドのコンテキストでは、サーバー上の NTP クライアントを使用して、公式サーバーから取得した公式時刻でサーバー時刻を更新します。すべての公開 NTP サーバーについては、https://www.pool.ntp.org/en/を確認してください。

目標

  • NTP クライアントがインストールされ、サーバーの時刻が同期されている

参考文献

手順

  1. ntp をインストールします。

    Debian ベースのシステムの場合:

    sudo apt install ntp
  2. NTP クライアントの構成ファイルのバックアップを作成します

    /etc/ntp.conf

    sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
  3. デフォルトの設定は、少なくとも Debian ではすでにかなり安全です。確認したい唯一のことは、私たちが

    pool
    ディレクティブであり、ディレクティブではないということです
    server
    。この
    pool
    ディレクティブにより、NTP クライアントは、サーバーが応答しない場合や時刻が悪い場合にサーバーの使用を停止できます。
    server
    これを行うには、すべてのディレクティブをコメント アウトし、以下を に追加します
    /etc/ntp.conf

    pool pool.ntp.org iburst
    

    怠け者の場合

    sudo sed -i -r -e "s/^((server|pool).*)/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
    echo -e "\npool pool.ntp.org iburst         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf

    /etc/ntp.conf

    driftfile /var/lib/ntp/ntp.drift
    statistics loopstats peerstats clockstats
    filegen loopstats file loopstats type day enable
    filegen peerstats file peerstats type day enable
    filegen clockstats file clockstats type day enable
    restrict -4 default kod notrap nomodify nopeer noquery limited
    restrict -6 default kod notrap nomodify nopeer noquery limited
    restrict 127.0.0.1
    restrict ::1
    restrict source notrap nomodify noquery
    pool pool.ntp.org iburst         # added by user on 2019-03-09 @ 10:23:35
    
  4. ntp を再起動します。

    sudo service ntp restart
  5. ntp サービスのステータスを確認します。

    sudo systemctl status ntp
    ● ntp.service - LSB: Start NTP daemon
       Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
       Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
      Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
        Tasks: 2 (limit: 4915)
       CGroup: /system.slice/ntp.service
               └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113
    
    Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123
    Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123
    Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates
    Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35
    Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199
    Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
    
  6. ntp のステータスを確認します。

    sudo ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     pool.ntp.org    .POOL.          16 p    -   64    0    0.000    0.000   0.000
    *lithium.constan 198.30.92.2      2 u    -   64    1   19.900    4.894   3.951
     ntp2.wiktel.com 212.215.1.157    2 u    2   64    1   48.061   -0.431   0.104
    

目次

/proc の保護

どうして

https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/を引用するには:

調べると

/proc
、多くのファイルとディレクトリが見つかります。それらの多くは、特定のプロセス ID (PID) に関する情報を表す単なる数字です。デフォルトでは、Linux システムは、すべてのローカル ユーザーがこのすべての情報を表示できるように展開されます。これには、他のユーザーからのプロセス情報が含まれます。これには、他のユーザーと共有したくない機密情報が含まれる場合があります。ファイルシステム構成の調整を適用することで、この動作を変更し、システムのセキュリティを向上させることができます。

: 一部のシステムではこれが機能しない場合があり

systemd
ます。詳細については、 https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37を参照してください。共有してくれたnlgrangerに感謝します。

目標

  • /proc
    でマウントされて
    hidepid=2
    いるため、ユーザーは自分のプロセスに関する情報のみを表示できます

参考文献

手順

  1. のバックアップを作成し

    /etc/fstab
    ます:

    sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
  2. でマウントする

    /etc/fstab
    には、次の行を追加します。
    /proc
    hidepid=2

    proc     /proc     proc     defaults,hidepid=2     0     0
    

    怠け者の場合

    echo -e "\nproc     /proc     proc     defaults,hidepid=2     0     0         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
  3. システムを再起動します。

    sudo reboot now

    :別の方法として、

    /proc
    再起動せずに再マウントすることもできます
    sudo mount -o remount,hidepid=2 /proc

目次

アカウントに安全なパスワードの使用を強制する

どうして

デフォルトでは、アカウントは、悪いパスワードを含め、任意のパスワードを使用できます。pwquality / pam_pwqualityは、「システム パスワードのデフォルトのパスワード品質要件を設定する方法」を提供し、「システム ディクショナリに対する強度と不適切な選択を識別するための一連のルール」をチェックすることで、このセキュリティ ギャップに対処します。

使い方

Linux では、PAM が認証を担当します。https://en.wikipedia.org/wiki/Linux_PAMで読むことができる PAM の 4 つのタスクがあります。このセクションでは、パスワード タスクについて説明します。

アカウントのパスワードを設定または変更する必要がある場合、PAM のパスワード タスクが要求を処理します。このセクションでは、要求された新しいパスワードを libpam-pwquality に渡して、要件を満たしていることを確認するように PAM のパスワード タスクに指示します。要件が満たされている場合は、それが使用/設定されます。要件を満たしていない場合は、エラーが発生し、ユーザーに通知されます。

目標

  • 強化された強力なパスワード

手順

  1. libpam-pwquality をインストールします。

    Debian ベースのシステムの場合:

    sudo apt install libpam-pwquality
  2. PAM のパスワード構成ファイルのバックアップを作成します

    /etc/pam.d/common-password

    sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
  3. libpam-pwquality を使用してファイル

    /etc/pam.d/common-password
    を編集し、次のように始まる行を変更して強力なパスワードを強制するように PAM に指示します。

    password        requisite                       pam_pwquality.so
    

    これに:

    password        requisite                       pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
    

    上記のオプションは次のとおりです。

    • retry=3
      = エラーで戻る前にユーザーに 3 回プロンプトを表示します。
    • minlen=10
      = クレジット (またはデビット) を考慮した、パスワードの最小長:
      • dcredit=-1
        = 少なくとも1 桁の数字が必要です
      • ucredit=-1
        = 少なくとも1 つの大文字が必要です
      • lcredit=-1
        = 少なくとも1 つの小文字が必要です
      • ocredit=-1
        = 少なくとも1 つの英数字以外の文字が必要です
    • difok=3
      = 新しいパスワードの 3 文字以上を古いパスワードに使用することはできません
    • maxrepeat=3
      = 最大 3 文字の繰り返しを許可
    • gecoschec
      = アカウント名のパスワードを許可しない

    怠け者の場合

    sudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password

目次

自動セキュリティ更新とアラート

どうして

サーバーを最新の重要なセキュリティ パッチと更新プログラムで更新しておくことが重要です。そうしないと、悪意のある人物がサーバーへの不正アクセスを取得するために使用できる、既知のセキュリティの脆弱性の危険にさらされます。

サーバーを毎日チェックする予定がない限り、システムを自動的に更新したり、利用可能な更新に関するメールを受信したりする方法が必要になります。

更新ごとに何かが壊れるリスクがあるため、すべての更新を行う必要はありません。重要な更新を行うことは重要ですが、それ以外は手動で行う時間ができるまで待つことができます.

なぜだめですか

自動更新や無人更新により、システムが破損する可能性があり、サーバーの近くにいない可能性があります。SSH アクセスが切断された場合、これは特に問題になります。

ノート

  • 各ディストリビューションは、パッケージと更新を異なる方法で管理します。これまでのところ、Debian ベースのシステムの手順しかありません。
  • これが機能するには、サーバーに電子メールを送信する方法が必要です

目標

  • 重要なセキュリティ パッチの自動無人更新
  • 残りの保留中の更新の自動メール

Debian ベースのシステム

使い方

Debian ベースのシステムでは、以下を使用できます。

  • 必要なシステム更新 (重要なセキュリティ更新など) を自動的に行う無人アップグレード
  • インストール/アップグレード前にパッケージの変更に関する詳細を取得するための apt-listchanges
  • apticron は、保留中のパッケージの更新に関する電子メールを取得します

無人アップグレードを使用して重要なセキュリティ パッチを適用します。Debian コミュニティによってすでに徹底的にテストされているため、安定した更新を適用することもできます。

参考文献
手順
  1. unattended-upgrades、apt-listchanges、apticron をインストールします。

    sudo apt install unattended-upgrades apt-listchanges apticron
  2. 次に、無人アップグレードを構成して、更新を自動的に適用する必要があります。これは通常、パッケージによって作成されたファイル

    /etc/apt/apt.conf.d/20auto-upgrades
    を編集することによって行われ
    /etc/apt/apt.conf.d/50unattended-upgrades
    ます。ただし、これらのファイルは将来の更新で上書きされる可能性があるため、代わりに新しいファイルを作成します。ファイル
    /etc/apt/apt.conf.d/51myunattended-upgrades
    を作成し、これを追加します。

    // Enable the update/upgrade script (0=disable)
    APT::Periodic::Enable "1";
    
    // Do "apt-get update" automatically every n-days (0=disable)
    APT::Periodic::Update-Package-Lists "1";
    
    // Do "apt-get upgrade --download-only" every n-days (0=disable)
    APT::Periodic::Download-Upgradeable-Packages "1";
    
    // Do "apt-get autoclean" every n-days (0=disable)
    APT::Periodic::AutocleanInterval "7";
    
    // Send report mail to root
    //     0:  no report             (or null string)
    //     1:  progress report       (actually any string)
    //     2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
    //     3:  + trace on    APT::Periodic::Verbose "2";
    APT::Periodic::Unattended-Upgrade "1";
    
    // Automatically upgrade packages from these
    Unattended-Upgrade::Origins-Pattern {
          "o=Debian,a=stable";
          "o=Debian,a=stable-updates";
          "origin=Debian,codename=${distro_codename},label=Debian-Security";
    };
    
    // You can specify your own packages to NOT automatically upgrade here
    Unattended-Upgrade::Package-Blacklist {
    };
    
    // Run dpkg --force-confold --configure -a if a unclean dpkg state is detected to true to ensure that updates get installed even when the system got interrupted during a previous run
    Unattended-Upgrade::AutoFixInterruptedDpkg "true";
    
    //Perform the upgrade when the machine is running because we wont be shutting our server down often
    Unattended-Upgrade::InstallOnShutdown "false";
    
    // Send an email to this address with information about the packages upgraded.
    Unattended-Upgrade::Mail "root";
    
    // Always send an e-mail
    Unattended-Upgrade::MailOnlyOnError "false";
    
    // Remove all unused dependencies after the upgrade has finished
    Unattended-Upgrade::Remove-Unused-Dependencies "true";
    
    // Remove any new unused dependencies after the upgrade has finished
    Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
    
    // Automatically reboot WITHOUT CONFIRMATION if the file /var/run/reboot-required is found after the upgrade.
    Unattended-Upgrade::Automatic-Reboot "true";
    
    // Automatically reboot even if users are logged in.
    Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
    

    :

    • オプション
      /usr/lib/apt/apt.systemd.daily
      の詳細を確認する
      APT::Periodic
    • オプションの詳細については、https://github.com/mvo5/unattended-upgradesを確認してください。
      Unattended-Upgrade
  3. 無人アップグレードの予行演習を実行して、構成ファイルに問題がないことを確認します。

    sudo unattended-upgrade -d --dry-run

    すべてが問題なければ、スケジュールされたときにいつでも実行できるようにするか、 で強制的に実行できます

    unattended-upgrade -d

  4. 好みに合わせて apt-listchanges を構成します。

    sudo dpkg-reconfigure apt-listchanges
  5. apticron の場合、デフォルト設定で十分ですが

    /etc/apticron/apticron.conf
    、変更したい場合はチェックインできます。たとえば、私の構成は次のようになります。

    EMAIL="root"
    NOTIFY_NO_UPDATES="1"
    

目次

より安全なランダム エントロピー プール (WIP)

どうして

仕掛品

使い方

仕掛品

目標

仕掛品

参考文献

手順

  1. rng ツールをインストールします。

    Debian ベースのシステムの場合:

    sudo apt-get install rng-tools
  2. これを に追加して、乱数の生成に使用するハードウェア デバイスを設定する必要があります

    /etc/default/rng-tools

    HRNGDEVICE=/dev/urandom
    

    怠け者の場合

    echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
  3. サービスを再起動します。

    sudo systemctl stop rng-tools.service
    sudo systemctl start rng-tools.service
  4. ランダム性のテスト:

目次

ネットワーク

UFW を備えたファイアウォール (複雑でないファイアウォール)

どうして

偏執症と呼んでください。同意する必要はありませんが、明示的に許可するものを除いて、サーバーに出入りするすべてのトラフィックを拒否したいと考えています。サーバーが知らないトラフィックを送信するのはなぜですか? そして、それが誰であるか、または何であるかがわからない場合、外部トラフィックがサーバーにアクセスしようとするのはなぜですか? 優れたセキュリティに関して言えば、デフォルトで拒否/拒否し、例外的に許可するというのが私の意見です。

もちろん、同意しない場合は、まったく問題なく、ニーズに合わせて UFW を構成できます。

いずれにせよ、明示的に許可するトラフィックのみを確保するのがファイアウォールの役割です。

使い方

Linux カーネルは、ネットワーク トラフィックを監視および制御する機能を提供します。これらの機能は、ファイアウォール ユーティリティを通じてエンド ユーザーに公開されます。Linux では、最も一般的なファイアウォールはiptablesです。ただし、iptables はかなり複雑でわかりにくい (IMHO)。ここで UFW の出番です。UFW は iptables のフロントエンドと考えてください。これにより、Linux カーネルにネットワーク トラフィックの処理方法を指示する iptables ルールを管理するプロセスが簡素化されます。

UFWは、次のルールを構成できるようにすることで機能します。

  • 許可または拒否
  • 入力または出力トラフィック
  • ポートへ、またはポートから

ポートを明示的に指定するか、ポートを指定するアプリケーション構成を使用してルールを作成できます。

目標

  • 明示的に許可したものを除いて、入力と出力のすべてのネットワーク トラフィックがブロックされます

ノート

  • 他のプログラムをインストールするときに、必要なポート/アプリケーションを有効にする必要があります。

参考文献

手順

  1. ufwをインストールします。

    Debian ベースのシステムの場合:

    sudo apt install ufw
  2. すべての発信トラフィックを拒否します。

    sudo ufw default deny outgoing comment 'deny all outgoing traffic'
    Default outgoing policy changed to 'deny'
    (be sure to update your rules accordingly)
    

    あなたが私のように妄想的ではなく、すべての送信トラフィックを拒否したくない場合は、代わりに許可することができます:

    sudo ufw default allow outgoing comment 'allow all outgoing traffic'
  3. すべての着信トラフィックを拒否します。

    sudo ufw default deny incoming comment 'deny all incoming traffic'
  4. 明らかに、次の場所で SSH 接続が必要です。

    sudo ufw limit in ssh comment 'allow SSH connections in'
    Rules updated
    Rules updated (v6)
    
  5. 必要に応じて追加のトラフィックを許可します。いくつかの一般的なユースケース:

    # allow traffic out on port 53 -- DNS
    sudo ufw allow out 53 comment 'allow DNS calls out'
    
    # allow traffic out on port 123 -- NTP
    sudo ufw allow out 123 comment 'allow NTP out'
    
    # allow traffic out for HTTP, HTTPS, or FTP
    # apt might needs these depending on which sources you're using
    sudo ufw allow out http comment 'allow HTTP traffic out'
    sudo ufw allow out https comment 'allow HTTPS traffic out'
    sudo ufw allow out ftp comment 'allow FTP traffic out'
    
    # allow whois
    sudo ufw allow out whois comment 'allow whois'
    
    # allow traffic out on port 68 -- the DHCP client
    # you only need this if you're using DHCP
    sudo ufw allow out 67 comment 'allow the DHCP client to update'
    sudo ufw allow out 68 comment 'allow the DHCP client to update'

    : パッケージのインストールやその他多くのことを行うには、HTTP/HTTPS を許可する必要があります。

  6. ufw を開始します。

    sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    
  7. ステータスを表示する場合:

    sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    22/tcp                     LIMIT       Anywhere                   # allow SSH connections in
    22/tcp (v6)                LIMIT       Anywhere (v6)              # allow SSH connections in
    
    53                         ALLOW OUT   Anywhere                   # allow DNS calls out
    123                        ALLOW OUT   Anywhere                   # allow NTP out
    80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
    443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
    21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
    Mail submission            ALLOW OUT   Anywhere                   # allow mail out
    43/tcp                     ALLOW OUT   Anywhere                   # allow whois
    53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
    123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
    80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
    443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
    21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
    Mail submission (v6)       ALLOW OUT   Anywhere (v6)              # allow mail out
    43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
    

    また

    sudo ufw status verbose
    Status: active
    Logging: on (low)
    Default: deny (incoming), deny (outgoing), disabled (routed)
    New profiles: skip
    
    To                         Action      From
    --                         ------      ----
    22/tcp                     LIMIT IN    Anywhere                   # allow SSH connections in
    22/tcp (v6)                LIMIT IN    Anywhere (v6)              # allow SSH connections in
    
    53                         ALLOW OUT   Anywhere                   # allow DNS calls out
    123                        ALLOW OUT   Anywhere                   # allow NTP out
    80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
    443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
    21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
    587/tcp (Mail submission)  ALLOW OUT   Anywhere                   # allow mail out
    43/tcp                     ALLOW OUT   Anywhere                   # allow whois
    53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
    123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
    80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
    443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
    21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
    587/tcp (Mail submission (v6)) ALLOW OUT   Anywhere (v6)              # allow mail out
    43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
    

デフォルトのアプリケーション

ufw には、いくつかのデフォルトのアプリケーションが付属しています。あなたはそれらを見ることができます:

sudo ufw app list
Available applications:
  AIM
  Bonjour
  CIFS
  DNS
  Deluge
  IMAP
  IMAPS
  IPP
  KTorrent
  Kerberos Admin
  Kerberos Full
  Kerberos KDC
  Kerberos Password
  LDAP
  LDAPS
  LPD
  MSN
  MSN SSL
  Mail submission
  NFS
  OpenSSH
  POP3
  POP3S
  PeopleNearby
  SMTP
  SSH
  Socks
  Telnet
  Transmission
  Transparent Proxy
  VNC
  WWW
  WWW Cache
  WWW Full
  WWW Secure
  XMPP
  Yahoo
  qBittorrent
  svnserve

アプリに含まれるポートなど、アプリの詳細を取得するには、次のように入力します。

sudo ufw app info [app name]
sudo ufw app info DNS
Profile: DNS
Title: Internet Domain Name Server
Description: Internet Domain Name Server

Port:
  53

カスタム アプリケーション

If you don't want to create rules by explicitly providing the port number(s), you can create your own application configurations. To do this, create a file in

/etc/ufw/applications.d
.

For example, here is what you would use for Plex:

cat /etc/ufw/applications.d/plexmediaserver
[PlexMediaServer]
title=Plex Media Server
description=This opens up PlexMediaServer for http (32400), upnp, and autodiscovery.
ports=32469/tcp|32413/udp|1900/udp|32400/tcp|32412/udp|32410/udp|32414/udp|32400/udp

Then you can enable it like any other app:

sudo ufw allow plexmediaserver

(Table of Contents)

iptables Intrusion Detection And Prevention with PSAD

Why

Even if you have a firewall to guard your doors, it is possible to try brute-forcing your way in any of the guarded doors. We want to monitor all network activity to detect potential intrusion attempts, such has repeated attempts to get in, and block them.

How It Works

I can't explain it any better than user FINESEC from https://serverfault.com/ did at: https://serverfault.com/a/447604/289829.

Fail2BAN scans log files of various applications such as apache, ssh or ftp and automatically bans IPs that show the malicious signs such as automated login attempts. PSAD on the other hand scans iptables and ip6tables log messages (typically /var/log/messages) to detect and optionally block scans and other types of suspect traffic such as DDoS or OS fingerprinting attempts. It's ok to use both programs at the same time because they operate on different level.

And, since we're already using UFW so we'll follow the awesome instructions by netson at https://gist.github.com/netson/c45b2dc4e835761fbccc to make PSAD work with UFW.

References

Steps

  1. Install psad.

    On Debian based systems:

    sudo apt install psad
  2. Make a backup of psad's configuration file

    /etc/psad/psad.conf
    :

    sudo cp --archive /etc/psad/psad.conf /etc/psad/psad.conf-COPY-$(date +"%Y%m%d%H%M%S")
  3. Review and update configuration options in

    /etc/psad/psad.conf
    . Pay special attention to these:

    Setting Set To
    EMAIL_ADDRESSES
    your email address(s)
    HOSTNAME
    your server's hostname
    ENABLE_PSADWATCHD
    ENABLE_PSADWATCHD Y;
    ENABLE_AUTO_IDS
    ENABLE_AUTO_IDS Y;
    ENABLE_AUTO_IDS_EMAILS
    ENABLE_AUTO_IDS_EMAILS Y;
    EXPECT_TCP_OPTIONS
    EXPECT_TCP_OPTIONS Y;

    Check the configuration file psad's documentation at http://www.cipherdyne.org/psad/docs/config.html for more details.

  4. Now we need to make some changes to ufw so it works with psad by telling ufw to log all traffic so psad can analyze it. Do this by editing two files and adding these lines at the end but before the COMMIT line.

    Make backups:

    sudo cp --archive /etc/ufw/before.rules /etc/ufw/before.rules-COPY-$(date +"%Y%m%d%H%M%S")
    sudo cp --archive /etc/ufw/before6.rules /etc/ufw/before6.rules-COPY-$(date +"%Y%m%d%H%M%S")

    Edit the files:

    • /etc/ufw/before.rules
    • /etc/ufw/before6.rules

    And add add this at the end but before the COMMIT line:

    # log all traffic so psad can analyze
    -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
    -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
    

    Note: We're adding a log prefix to all the iptables logs. We'll need this for seperating iptables logs to their own file.

    For example:

    ...
    
    # log all traffic so psad can analyze
    -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
    -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
    
    # don't delete the 'COMMIT' line or these rules won't be processed
    COMMIT
    
  5. Now we need to reload/restart ufw and psad for the changes to take effect:

    sudo ufw reload
    
    sudo psad -R
    sudo psad --sig-update
    sudo psad -H
  6. Analyze iptables rules for errors:

    sudo psad --fw-analyze
    [+] Parsing INPUT chain rules.
    [+] Parsing INPUT chain rules.
    [+] Firewall config looks good.
    [+] Completed check of firewall ruleset.
    [+] Results in /var/log/psad/fw_check
    [+] Exiting.
    

    Note: If there were any issues you will get an e-mail with the error.

  7. Check the status of psad:

    sudo psad --Status
    [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on vm
    [+] psad_fw_read (pid: 3444)  %CPU: 0.0  %MEM: 2.2
        Running since: Sat Feb 16 01:03:09 2019
    
    [+] psad (pid: 3435)  %CPU: 0.2  %MEM: 2.7
        Running since: Sat Feb 16 01:03:09 2019
        Command line arguments: [none specified]
        Alert email address(es): root@localhost
    
    [+] Version: psad v2.4.3
    
    [+] Top 50 signature matches:
            [NONE]
    
    [+] Top 25 attackers:
            [NONE]
    
    [+] Top 20 scanned ports:
            [NONE]
    
    [+] iptables log prefix counters:
            [NONE]
    
        Total protocol packet counters:
    
    [+] IP Status Detail:
            [NONE]
    
        Total scan sources: 0
        Total scan destinations: 0
    
    [+] These results are available in: /var/log/psad/status.out
    

(Table of Contents)

Application Intrusion Detection And Prevention With Fail2Ban

Why

UFW tells your server what doors to board up so nobody can see them, and what doors to allow authorized users through. PSAD monitors network activity to detect and prevent potential intrusions -- repeated attempts to get in.

But what about the applications/services your server is running, like SSH and Apache, where your firewall is configured to allow access in. Even though access may be allowed that doesn't mean all access attempts are valid and harmless. What if someone tries to brute-force their way in to a web-app you're running on your server? This is where Fail2ban comes in.

How It Works

Fail2ban monitors the logs of your applications (like SSH and Apache) to detect and prevent potential intrusions. It will monitor network traffic/logs and prevent intrusions by blocking suspicious activity (e.g. multiple successive failed connections in a short time-span).

Goals

  • network monitoring for suspicious activity with automatic banning of offending IPs

Notes

  • As of right now, the only thing running on this server is SSH so we'll want Fail2ban to monitor SSH and ban as necessary.
  • As you install other programs, you'll need to create/configure the appropriate jails and enable them.

References

Steps

  1. Install fail2ban.

    On Debian based systems:

    sudo apt install fail2ban
  2. We don't want to edit

    /etc/fail2ban/fail2ban.conf
    or
    /etc/fail2ban/jail.conf
    because a future update may overwrite those so we'll create a local copy instead. Create the file
    /etc/fail2ban/jail.local
    and add this to it after replacing
    [LAN SEGMENT]
    and
    [your email]
    with the appropriate values:

    [DEFAULT]
    # the IP address range we want to ignore
    ignoreip = 127.0.0.1/8 [LAN SEGMENT]
    
    # who to send e-mail to
    destemail = [your e-mail]
    
    # who is the email from
    sender = [your e-mail]
    
    # since we're using exim4 to send emails
    mta = mail
    
    # get email alerts
    action = %(action_mwl)s
    

    Note: Your server will need to be able to send e-mails so Fail2ban can let you know of suspicious activity and when it banned an IP.

  3. We need to create a jail for SSH that tells fail2ban to look at SSH logs and use ufw to ban/unban IPs as needed. Create a jail for SSH by creating the file

    /etc/fail2ban/jail.d/ssh.local
    and adding this to it:

    [sshd]
    enabled = true
    banaction = ufw
    port = ssh
    filter = sshd
    logpath = %(sshd_log)s
    maxretry = 5
    

    For the lazy:

    cat << EOF | sudo tee /etc/fail2ban/jail.d/ssh.local
    [sshd]
    enabled = true
    banaction = ufw
    port = ssh
    filter = sshd
    logpath = %(sshd_log)s
    maxretry = 5
    EOF
  4. In the above we tell fail2ban to use the ufw as the

    banaction
    . Fail2ban ships with an action configuration file for ufw. You can see it in
    /etc/fail2ban/action.d/ufw.conf

  5. Enable fail2ban:

    sudo fail2ban-client start
    sudo fail2ban-client reload
    sudo fail2ban-client add sshd # This may fail on some systems if the sshd jail was added by default
  6. To check the status:

    sudo fail2ban-client status
    Status
    |- Number of jail:      1
    `- Jail list:   sshd
    
    sudo fail2ban-client status sshd
    Status for the jail: sshd
    |- Filter
    |  |- Currently failed: 0
    |  |- Total failed:     0
    |  `- File list:        /var/log/auth.log
    `- Actions
       |- Currently banned: 0
       |- Total banned:     0
       `- Banned IP list:
    

Custom Jails

I have not needed to create a custom jail yet. Once I do, and I figure out how, I will update this guide. Or, if you know how please help contribute.

Unban an IP

To unban an IP use this command:

fail2ban-client set [jail] unbanip [IP]

[jail]
is the name of the jail that has the banned IP and
[IP]
is the IP address you want to unban. For example, to unaban
192.168.1.100
from SSH you would do:

fail2ban-client set sshd unbanip 192.168.1.100

(Table of Contents)

The Auditing

File/Folder Integrity Monitoring With AIDE (WIP)

Why

WIP

How It Works

WIP

Goals

WIP

References

Steps

  1. Install AIDE.

    On Debian based systems:

    sudo apt install aide aide-common
  2. Make a backup of AIDE's defaults file:

    sudo cp -p /etc/default/aide /etc/default/aide-COPY-$(date +"%Y%m%d%H%M%S")
  3. Go through

    /etc/default/aide
    and set AIDE's defaults per your requirements. If you want AIDE to run daily and e-mail you, be sure to set
    CRON_DAILY_RUN
    to
    yes
    .

  4. Make a backup of AIDE's configuration files:

    sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")
  5. On Debian based systems:

    • AIDE's configuration files are in
      /etc/aide/aide.conf.d/
      .
    • You'll want to go through AIDE's documentation and the configuration files in to set them per your requirements.
    • If you want new settings, to monitor a new folder for example, you'll want to add them to
      /etc/aide/aide.conf
      or
      /etc/aide/aide.conf.d/
      .
    • Take a backup of the stock configuration files:
      sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")
      .
  6. Create a new database, and install it.

    On Debian based systems:

    sudo aideinit
    Running aide --init...
    Start timestamp: 2019-04-01 21:23:37 -0400 (AIDE 0.16)
    AIDE initialized database at /var/lib/aide/aide.db.new
    Verbose level: 6
    
    Number of entries:      25973
    
    ---------------------------------------------------
    The attributes of the (uncompressed) database(s):
    ---------------------------------------------------
    
    /var/lib/aide/aide.db.new
      RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
      TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
      SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
                 g16VTPpIfYQ=
      SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
                 rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
                 tV+jt3ELvwFzGefq4ZBNMg==
      CRC32    : /cusZw==
      HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
                 CPGQSW4tl14=
      GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
                 aMv7Oby604A=
    
    
    End timestamp: 2019-04-01 21:24:45 -0400 (run time: 1m 8s)
    
  7. Test everything works with no changes.

    On Debian based systems:

    sudo aide.wrapper --check
    Start timestamp: 2019-04-01 21:24:45 -0400 (AIDE 0.16)
    AIDE found NO differences between database and filesystem. Looks okay!!
    Verbose level: 6
    
    Number of entries:      25973
    
    ---------------------------------------------------
    The attributes of the (uncompressed) database(s):
    ---------------------------------------------------
    
    /var/lib/aide/aide.db
      RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
      TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
      SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
                 g16VTPpIfYQ=
      SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
                 rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
                 tV+jt3ELvwFzGefq4ZBNMg==
      CRC32    : /cusZw==
      HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
                 CPGQSW4tl14=
      GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
                 aMv7Oby604A=
    
    
    End timestamp: 2019-04-01 21:26:03 -0400 (run time: 1m 18s)
    
  8. Test everything works after making some changes.

    On Debian based systems:

    sudo touch /etc/test.sh
    sudo touch /root/test.sh
    
    sudo aide.wrapper --check
    
    sudo rm /etc/test.sh
    sudo rm /root/test.sh
    
    sudo aideinit -y -f
    Start timestamp: 2019-04-01 21:37:37 -0400 (AIDE 0.16)
    AIDE found differences between database and filesystem!!
    Verbose level: 6
    
    Summary:
      Total number of entries:      25972
      Added entries:                2
      Removed entries:              0
      Changed entries:              1
    
    ---------------------------------------------------
    Added entries:
    ---------------------------------------------------
    
    f++++++++++++++++: /etc/test.sh
    f++++++++++++++++: /root/test.sh
    
    ---------------------------------------------------
    Changed entries:
    ---------------------------------------------------
    
    d =.... mc.. .. .: /root
    
    ---------------------------------------------------
    Detailed information about changes:
    ---------------------------------------------------
    
    Directory: /root
      Mtime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
      Ctime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
    
    
    ---------------------------------------------------
    The attributes of the (uncompressed) database(s):
    ---------------------------------------------------
    
    /var/lib/aide/aide.db
      RMD160   : qF9WmKaf2PptjKnhcr9z4ueCPTY=
      TIGER    : zMo7MvvYJcq1hzvTQLPMW7ALeFiyEqv+
      SHA256   : LSLLVjjV6r8vlSxlbAbbEsPcQUB48SgP
                 pdVqEn6ZNbQ=
      SHA512   : Qc4U7+ZAWCcitapGhJ1IrXCLGCf1IKZl
                 02KYL1gaZ0Fm4dc7xLqjiquWDMSEbwzW
                 oz49NCquqGz5jpMIUy7UxA==
      CRC32    : z8ChEA==
      HAVAL    : YapzS+/cdDwLj3kHJEq8fufLp3DPKZDg
                 U12KCSkrO7Y=
      GOST     : 74sLV4HkTig+GJhokvxZQm7CJD/NR0mG
                 6jV7zdt5AXQ=
    
    
    End timestamp: 2019-04-01 21:38:50 -0400 (run time: 1m 13s)
    
  9. That's it. If you set

    CRON_DAILY_RUN
    to
    yes
    in
    /etc/default/aide
    then cron will execute
    /etc/cron.daily/aide
    every day and e-mail you the output.

Updating The Database

Every time you make changes to files/folders that AIDE monitors, you will need to update the database to capture those changes. To do that on Debian based systems:

sudo aideinit -y -f

(Table of Contents)

Anti-Virus Scanning With ClamAV (WIP)

Why

WIP

How It Works

  • ClamAV is a virus scanner
  • ClamAV-Freshclam is a service that keeps the virus definitions updated
  • ClamAV-Daemon keeps the
    clamd
    process running to make scanning faster

Goals

WIP

Notes

  • These instructions do not tell you how to enable the ClamAV daemon service to ensure
    clamd
    is running all the time.
    clamd
    is only if you're running a mail server and does not provide real-time monitoring of files. Instead, you'd want to scan files manually or on a schedule.

References

Steps

  1. Install ClamAV.

    On Debian based systems:

    sudo apt install clamav clamav-freshclam clamav-daemon
  2. Make a backup of

    clamav-freshclam
    's configuration file
    /etc/clamav/freshclam.conf
    :

    sudo cp --archive /etc/clamav/freshclam.conf /etc/clamav/freshclam.conf-COPY-$(date +"%Y%m%d%H%M%S")
  3. clamav-freshclam
    's default settings are probably good enough but if you want to change them, you can either edit the file
    /etc/clamav/freshclam.conf
    or use
    dpkg-reconfigure
    :

    sudo dpkg-reconfigure clamav-freshclam

    Note: The default settings will update the definitions 24 times in a day. To change the interval, check the

    Checks
    setting in
    /etc/clamav/freshclam.conf
    or use
    dpkg-reconfigure
    .

  4. Start the

    clamav-freshclam
    service:

    sudo service clamav-freshclam start
  5. You can make sure

    clamav-freshclam
    running:

    sudo service clamav-freshclam status
    ● clamav-freshclam.service - ClamAV virus database updater
       Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)   Active: active (running) since Sat 2019-03-16 22:57:07 EDT; 2min 13s ago
         Docs: man:freshclam(1)
               man:freshclam.conf(5)
               https://www.clamav.net/documents
     Main PID: 1288 (freshclam)
       CGroup: /system.slice/clamav-freshclam.service
               └─1288 /usr/bin/freshclam -d --foreground=true
    
    Mar 16 22:57:08 host freshclam[1288]: Sat Mar 16 22:57:08 2019 -> ^Local version: 0.100.2 Recommended version: 0.101.1
    Mar 16 22:57:08 host freshclam[1288]: Sat Mar 16 22:57:08 2019 -> DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
    Mar 16 22:57:15 host freshclam[1288]: Sat Mar 16 22:57:15 2019 -> Downloading main.cvd [100%]
    Mar 16 22:57:38 host freshclam[1288]: Sat Mar 16 22:57:38 2019 -> main.cvd updated (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
    Mar 16 22:57:40 host freshclam[1288]: Sat Mar 16 22:57:40 2019 -> Downloading daily.cvd [100%]
    Mar 16 22:58:13 host freshclam[1288]: Sat Mar 16 22:58:13 2019 -> daily.cvd updated (version: 25390, sigs: 1520006, f-level: 63, builder: raynman)
    Mar 16 22:58:14 host freshclam[1288]: Sat Mar 16 22:58:14 2019 -> Downloading bytecode.cvd [100%]
    Mar 16 22:58:16 host freshclam[1288]: Sat Mar 16 22:58:16 2019 -> bytecode.cvd updated (version: 328, sigs: 94, f-level: 63, builder: neo)
    Mar 16 22:58:24 host freshclam[1288]: Sat Mar 16 22:58:24 2019 -> Database updated (6086349 signatures) from db.local.clamav.net (IP: 104.16.219.84)
    Mar 16 22:58:24 host freshclam[1288]: Sat Mar 16 22:58:24 2019 -> ^Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory
    

    Note: Don't worry about that

    Local version
    line. Check https://serverfault.com/questions/741299/is-there-a-way-to-keep-clamav-updated-on-debian-8 for more details.

  6. Make a backup of

    clamav-daemon
    's configuration file
    /etc/clamav/clamd.conf
    :

    sudo cp --archive /etc/clamav/clamd.conf /etc/clamav/clamd.conf-COPY-$(date +"%Y%m%d%H%M%S")
  7. You can change

    clamav-daemon
    's settings by editing the file
    /etc/clamav/clamd.conf
    or useing
    dpkg-reconfigure
    :

    sudo dpkg-reconfigure clamav-daemon

Scanning Files/Folders

  • To scan files/folders use the
    clamscan
    program.
  • clamscan
    runs as the user it is executed as so it needs read permissions to the files/folders it is scanning.
  • Using
    clamscan
    as
    root
    is dangerous because if a file is in fact a virus there is risk that it could use the root privileges.
  • To scan a file:
    clamscan /path/to/file
    .
  • To scan a directory:
    clamscan -r /path/to/folder
    .
  • You can use the
    -i
    switch to only print infected files.
  • Check
    clamscan
    's
    man
    pages for other switches/options.

(Table of Contents)

Rootkit Detection With Rkhunter (WIP)

Why

WIP

How It Works

WIP

Goals

WIP

References

Steps

  1. Install Rkhunter.

    On Debian based systems:

    sudo apt install rkhunter
  2. Make a backup of rkhunter' defaults file:

    sudo cp -p /etc/default/rkhunter /etc/default/rkhunter-COPY-$(date +"%Y%m%d%H%M%S")
  3. rkhunter's configuration file is

    /etc/rkhunter.conf
    . Instead of making changes to it, create and use the file
    /etc/rkhunter.conf.local
    instead:

    sudo cp -p /etc/rkhunter.conf /etc/rkhunter.conf.local
  4. Go through the configuration file

    /etc/rkhunter.conf.local
    and set to your requirements. My recommendations:

    Setting Note
    UPDATE_MIRRORS=1
    MIRRORS_MODE=0
    MAIL-ON-WARNING=root
    COPY_LOG_ON_ERROR=1
    to save a copy of the log if there is an error
    PKGMGR=...
    set to the appropriate value per the documentation
    PHALANX2_DIRTEST=1
    read the documentation for why
    WEB_CMD=""
    this is to address an issue with the Debian package that disables the ability for rkhunter to self-update.
    USE_LOCKING=1
    to prevent issues with rkhunter running multiple times
    SHOW_SUMMARY_WARNINGS_NUMBER=1
    to see the actual number of warnings found
  5. You want rkhunter to run every day and e-mail you the result. You can write your own script or check https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/ for a sample cron script you can use.

    On Debian based system, rkhunter comes with cron scripts. To enable them check

    /etc/default/rkhunter
    or use
    dpkg-reconfigure
    and say
    Yes
    to all of the questions:

    sudo dpkg-reconfigure rkhunter
  6. After you've finished with all of the changes, make sure all the settings are valid:

    sudo rkhunter -C
  7. Update rkhunter and its database:

    sudo rkhunter --versioncheck
    sudo rkhunter --update
    sudo rkhunter --propupd
  8. 手動スキャンを実行して出力を確認する場合:

    sudo rkhunter --check

目次

chrootkit によるルートキット検出 (WIP)

どうして

仕掛品

使い方

仕掛品

目標

仕掛品

参考文献

手順

  1. chkrootkit をインストールします。

    Debian ベースのシステムの場合:

    sudo apt install chkrootkit
  2. 手動スキャンを実行します。

    sudo chkrootkit
    ROOTDIR is `/'
    Checking `amd'...                                           not found
    Checking `basename'...                                      not infected
    Checking `biff'...                                          not found
    Checking `chfn'...                                          not infected
    Checking `chsh'...                                          not infected
    ...
    Checking `scalper'...                                       not infected
    Checking `slapper'...                                       not infected
    Checking `z2'...                                            chklastlog: nothing deleted
    Checking `chkutmp'...                                       chkutmp: nothing deleted
    Checking `OSX_RSPLUG'...                                    not infected
    
  3. chkrootkit の構成ファイルのバックアップを作成します

    /etc/chkrootkit.conf

    sudo cp --archive /etc/chkrootkit.conf /etc/chkrootkit.conf-COPY-$(date +"%Y%m%d%H%M%S")
  4. chkrootkit を毎日実行し、結果を電子メールで送信したいとします。

    Debian ベースのシステムでは、chkrootkit に cron スクリプトが付属しています。それらを有効にするには、最初の質問を確認

    /etc/chkrootkit.conf
    または使用
    dpkg-reconfigure
    して言います。
    Yes

    sudo dpkg-reconfigure chkrootkit

目次

logwatch - システムログアナライザーおよびレポーター

どうして

サーバーは、重要な情報を含む可能性のある多くのログを生成します。サーバーを毎日チェックする予定がない場合は、サーバーのログの概要を電子メールで取得する方法が必要になります。これを達成するために、logwatchを使用します。

使い方

logwatch は、システム ログ ファイルをスキャンして要約します。コマンドラインから直接実行するか、定期的なスケジュールで実行するようにスケジュールできます。logwatch はサービス ファイルを使用して、ログ ファイルの読み取り/要約方法を認識します。ですべてのストック サービス ファイルを確認できます

/usr/share/logwatch/scripts/services

logwatch の構成ファイルは、

/usr/share/logwatch/default.conf/logwatch.conf
デフォルトのオプションを指定します。コマンドライン引数を介してそれらをオーバーライドできます。

目標

  • サーバーのすべてのステータスとログの要約を毎日電子メールで送信するように構成された Logwatch

ノート

  • これが機能するには、サーバーが電子メールを送信できる必要があります
  • 以下の手順により、logwatch が毎日実行されます。スケジュールを変更したい場合は、cronjob を好みに合わせて変更してください。オプションを変更して
    range
    、再発ウィンドウをカバーすることもできます。例については、 https://www.badpenguin.org/configure-logwatch-for-weekly-email-and-html-output-formatを参照してください。
  • 電子メールの行が長いために logwatch がメールの配信に失敗した場合は、https://blog.dhampir.no/content/exim4-line-length-in-debian-stretch-mail-delivery-failed-returning-message を確認してください-issue #29に記載されている送信者へ。Gmail と Exim4 As MTA With Implicit TLSに従っている場合は、手順 7 で既にこれを処理しています。

参考文献

手順

  1. ログウォッチをインストールします。

    Debian ベースのシステムの場合:

    sudo apt install logwatch
  2. logwatch が収集するもののサンプルを表示するには、直接実行できます。

    sudo /usr/sbin/logwatch --output stdout --format text --range yesterday --service all
     ################### Logwatch 7.4.3 (12/07/16) ####################
            Processing Initiated: Mon Mar  4 00:05:50 2019
            Date Range Processed: yesterday
                                  ( 2019-Mar-03 )
                                  Period is day.
            Detail Level of Output: 5
            Type of Output/Format: stdout / text
            Logfiles for Host: host
     ##################################################################
    
     --------------------- Cron Begin ------------------------
    ...
    ...
     ---------------------- Disk Space End -------------------------
    
    
     ###################### Logwatch End #########################
    
  3. Go through logwatch's self-documented configuration file

    /usr/share/logwatch/default.conf/logwatch.conf
    before continuing. There is no need to change anything here but pay special attention to the
    Output
    ,
    Format
    ,
    MailTo
    ,
    Range
    , and
    Service
    as those are the ones we'll be using. For our purposes, instead of specifying our options in the configuration file, we will pass them as command line arguments in the daily cron job that executes logwatch. That way, if the configuration file is ever modified (e.g. during an update), our options will still be there.

  4. Make a backup of logwatch's daily cron file

    /etc/cron.daily/00logwatch
    and unset the execute bit:

    sudo cp --archive /etc/cron.daily/00logwatch /etc/cron.daily/00logwatch-COPY-$(date +"%Y%m%d%H%M%S")
    sudo chmod -x /etc/cron.daily/00logwatch-COPY*
  5. By default, logwatch outputs to

    stdout
    . Since the goal is to get a daily e-mail, we need to change the output type that logwatch uses to send e-mail instead. We could do this through the configuration file above, but that would apply to every time it is run -- even when we run it manually and want to see the output to the screen. Instead, we'll change the cron job that executes logwatch to send e-mail. This way, when run manually, we'll still get output to
    stdout
    and when run by cron, it'll send an e-mail. We'll also make sure it checks for all services, and change the output format to html so it's easier to read regardless of what the configuration file says. In the file
    /etc/cron.daily/00logwatch
    find the execute line and change it to:

    /usr/sbin/logwatch --output mail --format html --mailto root --range yesterday --service all
    
    #!/bin/bash
    
    #Check if removed-but-not-purged
    test -x /usr/share/logwatch/scripts/logwatch.pl || exit 0
    
    #execute
    /usr/sbin/logwatch --output mail --format html --mailto root --range yesterday --service all
    
    #Note: It's possible to force the recipient in above command
    #Just pass --mailto address@a.com instead of --output mail
    

    For the lazy:

    sudo sed -i -r -e "s,^($(sudo which logwatch).*?),# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n$(sudo which logwatch) --output mail --format html --mailto root --range yesterday --service all         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")," /etc/cron.daily/00logwatch
  6. You can test the cron job by executing it:

    sudo /etc/cron.daily/00logwatch

    Note: If logwatch fails to deliver mail due to the e-mail having long lines please check https://blog.dhampir.no/content/exim4-line-length-in-debian-stretch-mail-delivery-failed-returning-message-to-sender as documented in issue #29. If you you followed Gmail and Exim4 As MTA With Implicit TLS then we already took care of this in step #7.

(Table of Contents)

ss - Seeing Ports Your Server Is Listening On

Why

Ports are how applications, services, and processes communicate with each other -- either locally within your server or with other devices on the network. When you have an application or service (like SSH or Apache) running on your server, they listen for requests on specific ports.

Obviously we don't want your server listening on ports we don't know about. We'll use

ss
to see all the ports that services are listening on. This will help us track down and stop rogue, potentially dangerous, services.

Goals

  • find out non-localhost what ports are open and listening for connections

References

Steps

  1. To see the all the ports listening for traffic:

    sudo ss -lntup
    Netid  State      Recv-Q Send-Q     Local Address:Port     Peer Address:Port
    udp    UNCONN     0      0                      *:68                  *:*        users:(("dhclient",pid=389,fd=6))
    tcp    LISTEN     0      128                    *:22                  *:*        users:(("sshd",pid=4390,fd=3))
    tcp    LISTEN     0      128                   :::22                 :::*        users:(("sshd",pid=4390,fd=4))
    

    Switch Explanations:

    • l
      = display listening sockets
    • n
      = do now try to resolve service names
    • t
      = display TCP sockets
    • u
      = display UDP sockets
    • p
      = show process information
  2. If you see anything suspicious, like a port you're not aware of or a process you don't know, investigate and remediate as necessary.

(Table of Contents)

Lynis - Linux Security Auditing

Why

From https://cisofy.com/lynis/:

Lynis is a battle-tested security tool for systems running Linux, macOS, or Unix-based operating system. It performs an extensive health scan of your systems to support system hardening and compliance testing.

Goals

  • Lynis installed

Notes

References

Steps

  1. Install lynis. https://cisofy.com/lynis/#installation has detailed instructions on how to install it for your distribution.

    On Debian based systems, using CISOFY's community software repository:

    sudo apt install apt-transport-https ca-certificates host
    sudo wget -O - https://packages.cisofy.com/keys/cisofy-software-public.key | sudo apt-key add -
    sudo echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list
    sudo apt update
    sudo apt install lynis host
  2. Update it:

    sudo lynis update info
  3. Run a security audit:

    sudo lynis audit system

    This will scan your server, report its audit findings, and at the end it will give you suggestions. Spend some time going through the output and address gaps as necessary.

(Table of Contents)

OSSEC - Host Intrusion Detection

Why

From https://github.com/ossec/ossec-hids

OSSEC is a full platform to monitor and control your systems. It mixes together all the aspects of HIDS (host-based intrusion detection), log monitoring and SIM/SIEM together in a simple, powerful and open source solution.

Goals

  • OSSEC-HIDS installed

References

Steps

  1. Install OSSEC-HIDS from sources

    sudo apt install -y libz-dev libssl-dev libpcre2-dev build-essential libsystemd-dev
    wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz
    tar xzf 3.7.0.tar.gz
    cd ossec-hids-3.7.0/
    sudo ./install.sh
  2. Useful commands:

Agent information

 sudo /var/ossec/bin/agent_control -i <AGENT_ID>

AGENT_ID
by default is
000
, to be sure the command
sudo /var/ossec/bin/agent_control -l
can be used.

Run integrity/rootkit checking

OSSEC by default run rootkit check each 2 hours.

 sudo /var/ossec/bin/agent_control -u <AGENT_ID> -r 

Alerts

  • All:
    tail -f /var/ossec/logs/alerts/alerts.log
  • Integrity check:
    sudo cat /var/ossec/logs/alerts/alerts.log | grep -A4  -i integrity
  • Rootkit check:
     sudo cat /var/ossec/logs/alerts/alerts.log | grep -A4  "rootcheck,"

(Table of Contents)

The Danger Zone

Proceed At Your Own Risk

This sections cover things that are high risk because there is a possibility they can make your system unusable, or are considered unnecessary by many because the risks outweigh any rewards.

!! PROCEED AT YOUR OWN RISK !!

!! PROCEED AT YOUR OWN RISK !!

(Table of Contents)

Table of Contents

(Table of Contents)

Linux Kernel sysctl Hardening

!! PROCEED AT YOUR OWN RISK !!

Why

The kernel is the brains of a Linux system. Securing it just makes sense.

Why Not

Changing kernel settings with sysctl is risky and could break your server. If you don't know what you are doing, don't have the time to debug issues, or just don't want to take the risks, I would advise from not following these steps.

Disclaimer

I am not as knowledgeable about hardening/securing a Linux kernel as I'd like. As much as I hate to admit it, I do not know what all of these settings do. My understanding is that most of them are general kernel hardening and performance, and the others are to protect against spoofing and DOS attacks.

In fact, since I am not 100% sure exactly what each setting does, I took recommended settings from numerous sites (all linked in the references below) and combined them to figure out what should be set. I figure if multiple reputable sites mention the same setting, it's probably safe.

If you have a better understanding of what these settings do, or have any other feedback/advice on them, please let me know.

I won't provide For the lazy code in this section.

Notes

  • Documentation on all the sysctl settings/keys is severely lacking. The documentation I can find seems to reference the 2.2 version kernel. I could not find anything newer. If you know where I can, please let me know.
  • The reference sites listed below have more comments on what each setting does.

References

Steps

  1. The sysctl settings can be found in the linux-kernel-sysctl-hardening.md file in this repo.

  2. Before you make a kernel sysctl change permanent, you can test it with the sysctl command:

    sudo sysctl -w [key=value]

    Example:

    sudo sysctl -w kernel.ctrl-alt-del=0

    Note: There are no spaces in

    key=value
    , including before and after the space.

  3. Once you have tested a setting, and made sure it works without breaking your server, you can make it permanent by adding the values to

    /etc/sysctl.conf
    . For example:

    $ sudo cat /etc/sysctl.conf
    kernel.ctrl-alt-del = 0
    fs.file-max = 65535
    ...
    kernel.sysrq = 0
  4. After updating the file you can reload the settings or reboot. To reload:

    sudo sysctl -p

Note: If sysctl has trouble writing any settings then

sysctl -w
or
sysctl -p
will write an error to stderr. You can use this to quickly find invalid settings in your
/etc/sysctl.conf
file:

sudo sysctl -p >/dev/null

(Table of Contents)

Password Protect GRUB

!! PROCEED AT YOUR OWN RISK !!

Why

If a bad actor has physical access to your server, they could use GRUB to gain unauthorized access to your system.

Why Not

If you forget the password, you'll have to go through some work to recover the password.

Goals

  • auto boot the default Debian install and require a password for anything else

Notes

  • This will only protect GRUB and anything behind it like your operating systems. Check your motherboard's documentation for password protecting your BIOS to prevent a bad actor from circumventing GRUB.

References

Steps

  1. Create a Password-Based Key Derivation Function 2 (PBKDF2) hash of your password:

    grub-mkpasswd-pbkdf2 -c 100000

    The below output is from using

    password
    as the password:

    Enter password:
    Reenter password:
    PBKDF2 hash of your password is grub.pbkdf2.sha512.100000.2812C233DFC899EFC3D5991D8CA74068C99D6D786A54F603E9A1EFE7BAEDDB6AA89672F92589FAF98DB9364143E7A1156C9936328971A02A483A84C3D028C4FF.C255442F9C98E1F3C500C373FE195DCF16C56EEBDC55ABDD332DD36A92865FA8FC4C90433757D743776AB186BD3AE5580F63EF445472CC1D151FA03906D08A6D
    
  2. Copy everything after

    PBKDF2 hash of your password is 
    , starting from and including
    grub.pbkdf2.sha512...
    to the end. You'll need this in the next step.

  3. The

    update-grub
    program uses scripts to generate configuration files it will use for GRUB's settings. Create the file
    /etc/grub.d/01_password
    and add the below code after replacing
    [hash]
    with the hash you copied from the first step. This tells
    update-grub
    to use this username and password for GRUB.

    #!/bin/sh
    set -e
    
    cat << EOF
    set superusers="grub"
    password_pbkdf2 grub [hash]
    EOF

    For example:

    #!/bin/sh
    set -e
    
    cat << EOF
    set superusers="grub"
    password_pbkdf2 grub grub.pbkdf2.sha512.100000.2812C233DFC899EFC3D5991D8CA74068C99D6D786A54F603E9A1EFE7BAEDDB6AA89672F92589FAF98DB9364143E7A1156C9936328971A02A483A84C3D028C4FF.C255442F9C98E1F3C500C373FE195DCF16C56EEBDC55ABDD332DD36A92865FA8FC4C90433757D743776AB186BD3AE5580F63EF445472CC1D151FA03906D08A6D
    EOF
  4. Set the file's execute bit so

    update-grub
    includes it when it updates GRUB's configuration:

    sudo chmod a+x /etc/grub.d/01_password
  5. Make a backup of GRUB's configuration file

    /etc/grub.d/10_linux
    that we'll be modifying and unset the execute bit so
    update-grub
    doesn't try to run it:

    sudo cp --archive /etc/grub.d/10_linux /etc/grub.d/10_linux-COPY-$(date +"%Y%m%d%H%M%S")
    sudo chmod a-x /etc/grub.d/10_linux.*
  6. To make the default Debian install unrestricted (without the password) while keeping everything else restricted (with the password) modify

    /etc/grub.d/10_linux
    and add
    --unrestricted
    to the
    CLASS
    variable.

    For the lazy:

    sudo sed -i -r -e "/^CLASS=/ a CLASS=\"\${CLASS} --unrestricted\"         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" /etc/grub.d/10_linux
  7. Update GRUB with

    update-grub
    :

    sudo update-grub

(Table of Contents)

Disable Root Login

!! PROCEED AT YOUR OWN RISK !!

Why

If you have sudo configured properly, then the root account will mostly never need to log in directly -- either at the terminal or remotely.

Why Not

Be warned, this can cause issues with some configurations!

If your installation uses

sulogin
(like Debian) to drop to a root console during boot failures, then locking the root account will prevent
sulogin
from opening the root shell and you will get this error:

Cannot open access to console, the root account is locked.

See sulogin(8) man page for more details.

Press Enter to continue.

To work around this, you can use the

--force
option for
sulogin
. Some distributions already include this, or some other, workaround.

An alternative to locking the root acount is set a long/complicated root password and store it in a secured, non digital format. That way you have it when/if you need it.

Goals

  • locked root account that nobody can use to log in as root

Notes

  • Some distributions disable root login by default (e.g. Ubuntu) so you may not need to do this step. Check with your distribution's documentation.

References

Steps

  1. Lock the root account:

    sudo passwd -l root

(Table of Contents)

Change Default umask

!! PROCEED AT YOUR OWN RISK !!

Why

umask controls the default permissions of files/folders when they are created. Insecure file/folder permissions give other accounts potentially unauthorized access to your data. This may include the ability to make configuration changes.

  • For non-root accounts, there is no need for other accounts to get any access to the account's files/folders by default.
  • For the root account, there is no need for the file/folder primary group or other accounts to have any access to root's files/folders by default.

When and if other accounts need access to a file/folder, you want to explicitly grant it using a combination of file/folder permissions and primary group.

Why Not

Changing the default umask can create unexpected problems. For example, if you set umask to

0077
for root, then non-root accounts will not have access to application configuration files/folders in
/etc/
which could break applications that do not run with root privileges.

How It Works

In order to explain how umask works I'd have to explain how Linux file/folder permissions work. As that is a rather complicated question, I will defer you to the references below for further reading.

Goals

  • set default umask for non-root accounts to 0027
  • set default umask for the root account to 0077

Notes

  • umask is a Bash built-in which means a user can change their own umask setting.

References

Steps

  1. Make a backup of files we'll be editing:

    sudo cp --archive /etc/profile /etc/profile-COPY-$(date +"%Y%m%d%H%M%S")
    sudo cp --archive /etc/bash.bashrc /etc/bash.bashrc-COPY-$(date +"%Y%m%d%H%M%S")
    sudo cp --archive /etc/login.defs /etc/login.defs-COPY-$(date +"%Y%m%d%H%M%S")
    sudo cp --archive /root/.bashrc /root/.bashrc-COPY-$(date +"%Y%m%d%H%M%S")
  2. Set default umask for non-root accounts to 0027 by adding this line to

    /etc/profile
    and
    /etc/bash.bashrc
    :

    umask 0027
    

    For the lazy:

    echo -e "\numask 0027         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/profile /etc/bash.bashrc
  3. We also need to add this line to

    /etc/login.defs
    :

    UMASK 0027
    

    For the lazy:

    echo -e "\nUMASK 0027         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/login.defs
  4. Set default umask for the root account to 0077 by adding this line to

    /root/.bashrc
    :

    umask 0077
    

    For the lazy:

    echo -e "\numask 0077         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /root/.bashrc

(Table of Contents)

Orphaned Software

!! PROCEED AT YOUR OWN RISK !!

Why

As you use your system, and you install and uninstall software, you'll eventually end up with orphaned, or unused software/packages/libraries. You don't need to remove them, but if you don't need them, why keep them? When security is a priority, anything not explicitly needed is a potential security threat. You want to keep your server as trimmed and lean as possible.

Notes

  • Each distribution manages software/packages/libraries differently so how you find and remove orphaned packages will be different. So far I only have steps for Debian based systems.

Debian Based Systems

On Debian based systems, you can use deborphan to find orphaned packages.

Why Not

Keep in mind, deborphan finds packages that have no package dependencies. That does not mean they are not used. You could very well have a package you use every day that has no dependencies that you wouldn't want to remove. And, if deborphan gets anything wrong, then removing critical packages may break your system.

Steps
  1. Install deborphan.

    sudo apt install deborphan
  2. Run deborphan as root to see a list of orphaned packages:

    sudo deborphan
    libxapian30
    libpipeline1
    
  3. Assuming you want to remove all of the packages deborphan finds, you can pass it's output to

    apt
    to remove them:

    sudo apt --autoremove purge $(deborphan)

(Table of Contents)

The Miscellaneous

The Simple way with MSMTP

(#msmtp-alternative)

Why

Well I will SIMPLIFY this method, to only output email using google mail account (and others). True Simple! :)

``` bash
#!/bin/bash
###### PLEASE .... EDIT IT...
USEREMAIL="usernameemail"
DOMPROV="gmail.com"
PWDEMAIL="passwordStrong"  ## ATTENTION DONT USE Special Chars.. like as SPACE # and some others not all. Feel free to test ;)
MAILPROV="smtp.google.com:583"
MYMAIL="$USRMAIL@$DOMPROV"
USERLOC="root"
#######
apt install -y msmtp
    ln -s /usr/bin/msmtp /usr/sbin/sendmail
#wget http://www.cacert.org/revoke.crl -O /etc/ssl/certs/revoke.crl
#chmod 644 /etc/ssl/certs/revoke.crl
touch /root/.msmtprc
cat <<EOF> .msmtprc
defaults
account gmail
host $MAILPROV
port $MAILPORT
#proxy_host 127.0.0.1
#proxy_port 9001
from $MYEMAIL
timeout off 
protocol smtp
#auto_from [(on|off)]
#from envelope_from
#maildomain [domain]
auth on
user $USRMAIL
passwordeval "gpg -q --for-your-eyes-only --no-tty -d /root/msmtp-mail.gpg"
#passwordeval "gpg --quiet --for-your-eyes-only --no-tty --decrypt /root/msmtp-mail.gpg"
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
#tls_crl_file /etc/ssl/certs/revoke.crl
#tls_fingerprint [fingerprint]
#tls_key_file [file]
#tls_cert_file [file]
tls_certcheck on
tls_force_sslv3 on
tls_min_dh_prime_bits 512
#tls_priorities [priorities]
#dsn_notify (off|condition)
#dsn_return (off|amount)
#domain argument
#keepbcc off
logfile /var/log/mail.log
syslog on
account default : gmail
EOF
chmod 0400 /root/.msmtprc

   ## In testing .. auto command
# echo -e "1\n4096\n\ny\n$MYUSRMAIL\n$MYEMAIL\nmy key\nO\n$PWDMAIL\n$PWDMAIL\n" | gpg --full-generate-key 
##
gpg --full-generate-key
gpg --output revoke.asc --gen-revoke $MYEMAIL
echo -e "$PWDEMAIL\n" | gpg -e -o /root/msmtp-mail.gpg --recipient $MYEMAIL
echo "export GPG_TTY=\$(tty)" >> .baschrc	
chmod 400 msmtp-mail.gpg

echo "Hello there" | msmtp --debug $MYEMAIL
echo"######################
## MSMTP Configured ##
######################"
```

DONE!! ;) (Table of Contents)

Gmail and Exim4 As MTA With Implicit TLS

Why

Unless you're planning on setting up your own mail server, you'll need a way to send e-mails from your server. This will be important for system alerts/messages.

You can use any Gmail account. I recommend you create one specific for this server. That way if your server is compromised, the bad-actor won't have any passwords for your primary account. Granted, if you have 2FA/MFA enabled and you use an app password, there isn't much a bad-actor can do with just the app password, but why take the risk?

There are many guides on-line that cover how to configure Gmail as MTA using STARTTLS including a previous version of this guide. With STARTTLS, an initial unencrypted connection is made and then upgraded to an encrypted TLS or SSL connection. Instead, with the approach outlined below, an encrypted TLS connection is made from the start.

Also, as discussed in issue #29 and here, exim4 will fail for messages with long lines. We'll fix this in this section too.

Goals

  • mail
    configured to send e-mails from your server using Gmail
  • long line support for exim4

References

Steps

  1. Install exim4. You will also need openssl and ca-certificates.

    On Debian based systems:

    sudo apt install exim4 openssl ca-certificates
  2. Configure exim4:

    For Debian based systems:

    sudo dpkg-reconfigure exim4-config

    You'll be prompted with some questions:

    Prompt Answer
    General type of mail configuration
    mail sent by smarthost; no local mail
    System mail name
    localhost
    IP-addresses to listen on for incoming SMTP connections
    127.0.0.1; ::1
    Other destinations for which mail is accepted (default)
    Visible domain name for local users
    localhost
    IP address or host name of the outgoing smarthost
    smtp.gmail.com::465
    Keep number of DNS-queries minimal (Dial-on-Demand)?
    No
    Split configuration into small files?
    No
  3. Make a backup of

    /etc/exim4/passwd.client
    :

    sudo cp --archive /etc/exim4/passwd.client /etc/exim4/passwd.client-COPY-$(date +"%Y%m%d%H%M%S")
  4. Add a line like this to

    /etc/exim4/passwd.client

    smtp.gmail.com:yourAccount@gmail.com:yourPassword
    *.google.com:yourAccount@gmail.com:yourPassword
    

    Notes:

    • Replace
      yourAccount@gmail.com
      and
      yourPassword
      with your details. If you have 2FA/MFA enabled on your Gmail then you'll need to create and use an app password here.
    • Always check
      host smtp.gmail.com
      for the most up-to-date domains to list.
  5. This file has your Gmail password so we need to lock it down:

    sudo chown root:Debian-exim /etc/exim4/passwd.client
    sudo chmod 640 /etc/exim4/passwd.client
  6. 次のステップは、exim4 が への暗号化された接続を確立するために使用する TLS 証明書を作成すること

    smtp.gmail.com
    です。Let's Encrypt のような独自の証明書を使用するか、openssl を使用して自分で作成することができます。openssl を呼び出して証明書を作成する exim4 に付属のスクリプトを使用します。

    sudo bash /usr/share/doc/exim4-base/examples/exim-gencert
    [*] Creating a self signed SSL certificate for Exim!
        This may be sufficient to establish encrypted connections but for
        secure identification you need to buy a real certificate!
    
        Please enter the hostname of your MTA at the Common Name (CN) prompt!
    
    Generating a RSA private key
    ..........................................+++++
    ................................................+++++
    writing new private key to '/etc/exim4/exim.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Code (2 letters) [US]:[redacted]
    State or Province Name (full name) []:[redacted]
    Locality Name (eg, city) []:[redacted]
    Organization Name (eg, company; recommended) []:[redacted]
    Organizational Unit Name (eg, section) []:[redacted]
    Server name (eg. ssl.domain.tld; required!!!) []:localhost
    Email Address []:[redacted]
    [*] Done generating self signed certificates for exim!
        Refer to the documentation and example configuration files
        over at /usr/share/doc/exim4-base/ for an idea on how to enable TLS
        support in your mail transfer agent.
    
  7. exim4 に TLS とポート 465 を使用するように指示し、exim4 の長い行の問題を修正するには、ファイルを作成して

    /etc/exim4/exim4.conf.localmacros
    以下を追加します。

    MAIN_TLS_ENABLE = 1
    REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS = *
    TLS_ON_CONNECT_PORTS = 465
    REQUIRE_PROTOCOL = smtps
    IGNORE_SMTP_LINE_LENGTH_LIMIT = true
    

    怠け者の場合

    cat << EOF | sudo tee /etc/exim4/exim4.conf.localmacros
    MAIN_TLS_ENABLE = 1
    REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS = *
    TLS_ON_CONNECT_PORTS = 465
    REQUIRE_PROTOCOL = smtps
    IGNORE_SMTP_LINE_LENGTH_LIMIT = true
    EOF
  8. exim4 の構成ファイルのバックアップを作成します

    /etc/exim4/exim4.conf.template

    sudo cp --archive /etc/exim4/exim4.conf.template /etc/exim4/exim4.conf.template-COPY-$(date +"%Y%m%d%H%M%S")
  9. ブロック

    /etc/exim4/exim4.conf.template
    の後に以下を追加します。
    .ifdef REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS ... .endif

    .ifdef REQUIRE_PROTOCOL
      protocol = REQUIRE_PROTOCOL
    .endif
    
    .ifdef REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS
      hosts_require_tls = REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS
    .endif
    .ifdef REQUIRE_PROTOCOL
        protocol = REQUIRE_PROTOCOL
    .endif
    .ifdef REMOTE_SMTP_HEADERS_REWRITE
      headers_rewrite = REMOTE_SMTP_HEADERS_REWRITE
    .endif
    

    怠け者の場合

    sudo sed -i -r -e '/^.ifdef REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS$/I { :a; n; /^.endif$/!ba; a\# added by '"$(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")"'\n.ifdef REQUIRE_PROTOCOL\n    protocol = REQUIRE_PROTOCOL\n.endif\n# end add' -e '}' /etc/exim4/exim4.conf.template
  10. 以下をブロック

    /etc/exim4/exim4.conf.template
    内に追加します。
    .ifdef MAIN_TLS_ENABLE

    .ifdef TLS_ON_CONNECT_PORTS
      tls_on_connect_ports = TLS_ON_CONNECT_PORTS
    .endif
    
    .ifdef MAIN_TLS_ENABLE
    .ifdef TLS_ON_CONNECT_PORTS
        tls_on_connect_ports = TLS_ON_CONNECT_PORTS
    .endif
    

    怠け者の場合

    sudo sed -i -r -e "/\.ifdef MAIN_TLS_ENABLE/ a # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n.ifdef TLS_ON_CONNECT_PORTS\n    tls_on_connect_ports = TLS_ON_CONNECT_PORTS\n.endif\n# end add" /etc/exim4/exim4.conf.template
  11. TLS を使用するように exim4 構成を更新してから、サービスを再起動します。

    sudo update-exim4.conf
    sudo service exim4 restart
  12. UFWを使用している場合は、465 で送信トラフィックを許可する必要があります。これを行うには、カスタム UFW アプリケーション プロファイルを作成して有効にします。ファイル

    /etc/ufw/applications.d/smtptls
    を作成し、これを追加してから実行します
    ufw allow out smtptls comment 'open TLS port 465 for use with SMPT to send e-mails'

    [SMTPTLS]
    title=SMTP through TLS
    description=This opens up the TLS port 465 for use with SMPT to send e-mails.
    ports=465/tcp
    

    怠け者の場合

    cat << EOF | sudo tee /etc/ufw/applications.d/smtptls
    [SMTPTLS]
    title=SMTP through TLS
    description=This opens up the TLS port 465 for use with SMPT to send e-mails.
    ports=465/tcp
    EOF
    
    sudo ufw allow out smtptls comment 'open TLS port 465 for use with SMPT to send e-mails'
  13. 次のような行を に追加して、電子メールをローカル アカウントに送信できるように、いくつかのメール エイリアスを追加します

    /etc/aliases

    user1: user1@gmail.com
    user2: user2@gmail.com
    ...
    

    サーバーに存在するすべてのローカル アカウントを追加する必要があります。

  14. セットアップをテストします。

    echo "test" | mail -s "Test" email@gmail.com
    sudo tail /var/log/exim4/mainlog
    

目次

個別の iptables ログ ファイル

どうして

iptables のログを調べなければならない時が来るでしょう。すべての iptables ログを独自のファイルに保存すると、探しているものを簡単に見つけることができます。

参考文献

Steps

  1. The first step is by telling your firewall to prefix all log entries with some unique string. If you're using iptables directly, you would do something like

    --log-prefix "[IPTABLES] "
    for all the rules. We took care of this in step step 4 of installing psad.

  2. After you've added a prefix to the firewall logs, we need to tell rsyslog to send those lines to its own file. Do this by creating the file

    /etc/rsyslog.d/10-iptables.conf
    and adding this:

    :msg, contains, "[IPTABLES] " /var/log/iptables.log
    & stop
    

    If you're expecting a lot if data being logged by your firewall, prefix the filename with a

    -
    "to omit syncing the file after every logging". For example:

    :msg, contains, "[IPTABLES] " -/var/log/iptables.log
    & stop
    

    Note: Remember to change the prefix to whatever you use.

    怠け者の場合

    cat << EOF | sudo tee /etc/rsyslog.d/10-iptables.conf
    :msg, contains, "[IPTABLES] " /var/log/iptables.log
    & stop
    EOF
  3. ファイアウォール メッセージを別のファイルに記録しているため、新しいファイルの場所を psad に伝える必要があります。ログファイルのパスを編集

    /etc/psad/psad.conf
    して設定します。
    IPT_SYSLOG_FILE
    例えば:

    IPT_SYSLOG_FILE /var/log/iptables.log;
    

    : プレフィックスを使用するものに変更することを忘れないでください。

    怠け者の場合

    sudo sed -i -r -e "s/^(IPT_SYSLOG_FILE\s+)([^;]+)(;)$/# \1\2\3       # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1\/var\/log\/iptables.log\3       # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/psad/psad.conf 
  4. psad と rsyslog を再起動して、変更を有効化 (または再起動) します。

    sudo psad -R
    sudo psad --sig-update
    sudo psad -H
    sudo service rsyslog restart
  5. 最後に、logrotate に新しいログ ファイルをローテーションするように指示する必要があります。これにより、ログ ファイルが大きくなってディスクがいっぱいになることはありません。ファイル

    /etc/logrotate.d/iptables
    を作成し、これを追加します。

    /var/log/iptables.log
    {
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
            invoke-rc.d rsyslog rotate > /dev/null
        endscript
    }
    

    怠け者の場合

    cat << EOF | sudo tee /etc/logrotate.d/iptables
    /var/log/iptables.log
    {
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
            invoke-rc.d rsyslog rotate > /dev/null
        endscript
    }
    EOF

目次

残り物

私に連絡する

質問、コメント、懸念、フィードバック、または問題については、新しい問題を送信してください。

目次

便利なリンク

  • https://github.com/pratiktri/server_init_harden - 基本的なレベルのセキュリティを提供するために、新しい Linux サーバーで実行する必要があるいくつかのタスクを自動化する Bash スクリプト。

目次

謝辞

目次

ライセンスと著作権

CC-BY-SA

Anchal NigamによるLinux サーバーを保護する方法は、 Creative Commons Attribution-ShareAlike 4.0 International License の下でライセンスされています。

完全なライセンスについては、 LICENSEを参照してください。

目次