効果的な簡単のWebサーバセキュリティ対策「Go/Ruby on Rails/Spring(SpringBoot)/Node.js/Python(Django/Flask)編」

今回は「効果的な簡単のWebサーバセキュリティ対策」の第3弾、ちなみに今回はWebプログラミング言語のセキュリティ対策の最終回です、明日はこのチュートリアルシリーズの最終回、「Linux編」です。

正直、個人的には今回のチュートリアルで書くことはあまりないと思っている。

なぜなら、この5つWebプログラミング言語のセキュリティ対策は、インフラエンジニアとはほとんど関係ない、やれるな対策は大体4つだけだ。

# 言語の特徴解明

なぜそうなのかというと、まつ私にこの5つの言語でWebアプリケーションを開発するの時、特徴を簡単に解明します。

## Golang

Goはコンパイルされた言語です。 Go言語一つの特徴は、それは自分自身がフレームワークです（Go標準ライブラリ）。Go用のサードパーティ製ライブラリはすべて、Go言語の標準ライブラリの上に開発されています。実行ファイルにコンパイルする過程で、Goのコンパイラはランタイム環境全体をコンパイルします。例えば、標準ライブラリのみを使用する場合、Go言語はわずか10行のコードでHTTPサーバを実装し、通常のHTMLを出力することができる。

でも、一般的に、Go言語をWebアプリケーションに開発する時、大部分の開発者はほとんどにWebフレームワークを使っています。例え「Echo」とか「Gin」とか「Iris」とか「Beego」とか。

しかし、どのようなフレームワークを使用しても、最後で、一般的には、Web開発エンジニアは、インフラエンジニアたちに、コンパイル完成したのバイナリファイルのみを提供するだけだ。

## Ruby on Rails

名前からもわかるように、Ruby on RailsはRubyスクリプト言語をベースにしたWeb開発フレームワークです。Railsの利点は、開発が非常に速く、開発者はビジネスロジックの実装だけに集中すればよく、他の問題についてあまり心配する必要がないことです。

Railsには、本番環境で直接使用できるWebServerモジュール（pumaとunicornとpassengerなど）があります。Nginxなどの専門WebServerがない時独立実行ができる。

実はRailsのセキュリティ設定もWeb開発エンジニアの仕事だ、我々インフラエンジニアには関係ないです。Web開発エンジニアが開発したRailsのプロジェクトファイルをインフラエンジニアに提供したら、ただのプロジェクトを実行するだけで、別の事何もしません。

## Spring(SpringBoot)

Springは、Javaのアプリケーションフレームワークです。このフレームワークは、Webアプリケーションの開発だけでなく、大体すべてのプロジェクトは全部できる。だからこれはアプリケーションフレームワークに呼ばれるの理由だ。

springフレームワークを使わずにJavaウェブアプリケーションを開発するには、TomcatのようなJava Servletウェブコンテナを実行する必要があります。

しかし、Spring自身はWebコンテナそしてWebServerがあります。同時に性能は非常に良いです。

その原因で、Springウェブアプリケーションのセキュリティ設定もWeb開発エンジニアの仕事だ。Railsみたいの状況だ。

## Node.js

Node.jsはGoogle V8 JavaScriptエンジン上に構築されたJavaScript実行環境です。つまり、Node.jsは実際にはJavaScriptスクリプト言語です。ウェブアプリケーションの開発はほとんどこの「express」のウェブフレームワークを使います。大体の状況とRailsは同じだ。しかし、そのGoogle V8 JavaScriptエンジンの性能は非常に強いですが、実行速度はRailsより何十倍があるだ。


## Python(Django/Flask)

Pythonスクリプト言語です。でも、もしPythonを使って、webアプリケーションに開発するなら、99%はウェブフレームワークを使っています。
現在、Pythonで有名なウェブフレームワーク大体は「Django」と「Flask」２つだけだ。

一般的に、本番環境でPythonのwebアプリケーションを実行ために、どちらもnginxとuWSGIを使うことを選択します。ちょっとPHPぽい。

しかし、uWSGIはほとんど設定パラメータはありません、セキュリティ設定もない。だからといってPythonが安全な言語になるわけではありません。これに対して、PythonのWebアプリケーションフレームワークには、ここ数年で深刻なCVEセキュリティ脆弱性がいくつか見つかっています。

でも、私たちはただのインフラエンジニアだから、まだ何の関係もない。すべてはWeb開発エンジニアの仕事だ。

本当に何のことがしたいのば、本番環境に「Virtualenv」をインストールするだけだ。

## 5つ言語の共通グラウンド

- Webアプリケーションの開発は基本的にフレームワークに依存するか、あるいは自分自身がフレームワークです。
- セキュリティ対策は、基本的に開発者がある程度のセキュリティ意識を持っているかどうかにかかっています。
- インフラエンジニアの仕事は、単純にそれらを実行させることです。
- 脆弱性の修正は、基本的にはフレームワークのバージョンアップするだけだ。 でも、それがWeb開発エンジニアの仕事です。

------------------

つまり、インフラエンジニアにとって、この5つの言語で開発されたWebアプリケーションに対するセキュリティ対策は、ほぼ同じです。


# セキュリティ対策を実行

さて、何ができるか見てみましょう。

## 低権限のユーザーでWebアプリケーションを実行します。

これは基本的な常識です。

一般的に、新しいログインできないのノーマルユーザーを作成して、そしてそのユーザーでWebアプリケーションを実行します。

## ランタイム環境のバージョンを最新の状態に保つ

RubyとかJDKとかNode.jsとかPythonとか、これらは最新版にアップグレードして脆弱性を修正する必要があります。

しかし、Go言語が例外だ。だて、Web開発エンジニアが最新バージョンのGo言語を使用して再コンパイルする必要があります。

## Nginxを使ってWebアプリケーションをリバースプロキシします

それは、昨日の「Tomcat編」中にも説明しました。

標準外のHTTP 攻撃パケットを使用するいくつかの未知の攻撃を防ぐために、すべての外部からのアクセスはNginxに処理します。

## ウェブアプリケーションのコンテナ分離

コンテナ分離とは、ウェブアプリケーションやウェブアプリケーションのランタイム環境すべてをコンテナーの中に実行します。

Webアプリケーションサーバが侵害された後の更なる被害を防ぐことが目的です。

しかし、サーバー全体にWebアプリケーションが1つしかない場合は、コンテナ分離をする必要はありません。

私たちが一般的にコンテナ分離に使用する技術的な解決策は、以下の通りです：

- KVMなどの仮想マシンソリューション
- LXCとOpenVZなどのLinuxカーネルベースの仮想コンテナ技術
- Nginx unitなどのサンドボックス技術
- Dockerみたいなコンテナ技術

しかし、個人的には本番環境でDockerを使うことはあまりお勧めできません。なぜなら、Dockerのネットワークモジュールは非常に信頼性が低いからです。

同時に、一般的には以下のような管理プラットフォームで管理しています:-

- VMware ESXi (VMwareの仮想マシンソリューション)
- Proxmox (KVMとLXC)
- OpenStack (仮想マシンソリューション)
- Kubernetes (Dockerのコンテナ)

-------------------------------

# 結論

最初に述べたように、インフラエンジニアができることはほとんどないだ。

ちょっとつまんないかな？

じゃ私のようにDevOpsエンジニアになって、開発のための開発チームにも参加してみてはいかがでしょうか。