【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

現在「さくらVPS」「512MB」「685円/月のプランを利用しています。

今まで「Linux(CentOS)」の動作検証や、RubyやPythonでプログラムを作っていましたが、「Python」+「Django」でWebアプリケーションを作ります。

その理由は、メモリが「512MB」の最安値プランはスペックが低いのでWebアプリケーションに向かないのではと思ったのですが、ディスクがSSDということもあり意外とパフォーマンスがいいということが分かったからです。

 

 

さくらVPSの一番安いプラン「512MB」でWebアプリを作成する

さくらVPSの一番安いプラン「512MB」でWebアプリを作成します。

Webアプリは「Python」で開発し「Django」上で表示します。

以下のように設計しました。

 

セキュリティ設計(開放ポート)

一番重要なセキュリティ設計です。

 

■解放するポート

  • HTTP(TCP/80)  : all
  • HTTPS(TCP/443): all
  • SSH(TCP/22)   : all ※鍵認証にする

 

FTPのポート「TCP/20(データ)」「TCP/21(制御)」は開放しません。

データはFTPプロトコルではなく、SSHプロトコルで送信します。

 

ドメイン設計

ドメインは既に取得している「box-cm.com」を利用します。

 

SSL証明書設計

HTTPSプロトコルでWebアプリケーションにアクセスできるように、「さくらVPS」にSSL証明書を導入します。

SSL証明書は、無料で利用できる「Let's Encrypt」を利用します。

 

 

レンタルサーバーのサービスを利用せずに、自分で Let's Encrypt を導入する手順

 

 

 

構築手順

設計は完了したので実際に「さくらVPS」で構築をします。

※設計はざっくりとでいいので事前にテキストファイルなどに書いておくことをお勧めします。

 

パッケージを最新のアップデート

初めにCentOS7のパッケージを最新にアップデートします。

 

コマンドは「yum update」を実行します。

定期的に「yum update」で最新にアップデートをすることで脆弱性対応をしましょう。

[root@SAKURA_VPS ~]# yum update

 

 

アップデートが完了したら「reboot」コマンドでOSを再起動します。

[root@SAKURA_VPS ~]# reboot

 

 

firewalldの設定手順

詳しい「CentOS7」での「firewalld」設定手順は以下の記事を参考してください。

 

【さくらVPS】【CentOS7】Firewalld を設定する

 

 

■現在のファイアウォール(firewalld)の設定を確認する

初めに現在の設定を確認します。

 

現在、firewalld.serviceが起動しているかどうか、自動起動になっているか確認します。

[root@SAKURA_VPS log]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-09-23 11:52:35 JST; 1 months 4 days ago
     Docs: man:firewalld(1)
 Main PID: 18253 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq18253 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
[root@SAKURA_VPS log]# systemctl list-unit-files | grep firewalld.service
firewalld.service                             enabled ← 自動起動も「ON」になっています。
[root@SAKURA_VPS log]#

 

 

もし「firewalld.service」「停止」していたら、「自動起動」の設定になっていなかったら以下の手順で設定します。

[root@SAKURA_VPS html]# systemctl start firewalld.service ← firewalld.serviceを起動します。
[root@SAKURA_VPS html]# systemctl enable firewalld.service ← firewalld.serviceを自動起動する設定にします。

 

 

「firewall-cmd --list-all」コマンドで現在のファイアウォールの設定を確認します。

[root@SAKURA_VPS html]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http ← これが現在許可されているサービスです。
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS html]#

 

現在「ssh」と「http」だけなので「https」を追加します。

 

■httpsのポートを設定する(httpsを解放する)

以下のコマンドでhttpsのサービス(ポート)を解放します。

[root@SAKURA_VPS html]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@SAKURA_VPS html]#

 

--permanent ← permanentオプションで恒久対応します。(OSを再起動しても設定は消えません)

--zone=public ← firewalld.serviceにはゾーン(zone)があります。ゾーンを各NICに割り当てます。

 

ちなみに環境的には

  • NICは1つのみ
  • デフォルトのゾーンは「public」

なので、明示的に「public」に割り当てています。

 

デフォルトのゾーンの確認コマンド

[root@SAKURA_VPS html]# firewall-cmd --get-default-zone
public

 

 

 

 

■firewalld の再起動

firewalld.serviceへの設定を反映させるために、一度「firewalld.service」を再起動します。

[root@SAKURA_VPS html]# systemctl restart firewalld ← firewalld.serviceを再起動します。
[root@SAKURA_VPS html]# systemctl status firewalld -l ← firewalld.serviceのステータスを確認します。「-l」オプションを付けることでログを全文表示させます。
 firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-10-28 13:07:41 JST; 1min 42s ago
     Docs: man:firewalld(1)
 Main PID: 17604 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq17604 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

10月 28 13:07:40 tkx-2xx-3xxxx.vs.sakura.ne.jp systemd[1]: Starting firewalld - dynamic firewall daemon...
10月 28 13:07:41 tkx-2xx-3xxxx.vs.sakura.ne.jp systemd[1]: Started firewalld - dynamic firewall daemon.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: ICMP type 'beyond-scope' is not supported by the kernel for ipv6.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: beyond-scope: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: ICMP type 'failed-policy' is not supported by the kernel for ipv6.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: failed-policy: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: ICMP type 'reject-route' is not supported by the kernel for ipv6.
10月 28 13:07:42 tkx-2xx-3xxxx.vs.sakura.ne.jp firewalld[17604]: WARNING: reject-route: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
[root@SAKURA_VPS html]#

 

 

■firewalld.service のログに「WARNING」が出力されている

このサーバーはインターネットに晒されている状態なので「systemctl status xxx -l」でログを全文表示させて確認しました。

その結果「WARNING」が出力されていることが分かります。

現在の環境を確認します。

[root@SAKURA_VPS ~]# uname -a
Linux tkx-2xx-3xxxx.vs.sakura.ne.jp 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

[root@SAKURA_VPS ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

 

 

「firewalld」と「iptables」のバージョンを確認します。

[root@SAKURA_VPS ~]# rpm -qa | grep firewall
python-firewall-0.4.4.4-6.el7.noarch
firewalld-0.4.4.4-6.el7.noarch
fail2ban-firewalld-0.9.7-1.el7.noarch
firewalld-filesystem-0.4.4.4-6.el7.noarch
[root@SAKURA_VPS ~]# rpm -qa | grep iptables
iptables-1.4.21-18.2.el7_4.x86_64

 

 

iptablesコマンドを実行します。

[root@SAKURA_VPS ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_direct  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_IN_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_IN_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_OUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_OUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
OUTPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD_IN_ZONES (1 references)
target     prot opt source               destination
FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_OUT_ZONES (1 references)
target     prot opt source               destination
FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_direct (1 references)
target     prot opt source               destination

Chain FWDI_public (2 references)
target     prot opt source               destination
FWDI_public_log  all  --  0.0.0.0/0            0.0.0.0/0
FWDI_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
FWDI_public_allow  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0

Chain FWDI_public_allow (1 references)
target     prot opt source               destination

Chain FWDI_public_deny (1 references)
target     prot opt source               destination

Chain FWDI_public_log (1 references)
target     prot opt source               destination

Chain FWDO_public (2 references)
target     prot opt source               destination
FWDO_public_log  all  --  0.0.0.0/0            0.0.0.0/0
FWDO_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
FWDO_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain FWDO_public_allow (1 references)
target     prot opt source               destination

Chain FWDO_public_deny (1 references)
target     prot opt source               destination

Chain FWDO_public_log (1 references)
target     prot opt source               destination

Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain INPUT_direct (1 references)
target     prot opt source               destination
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22 match-set fail2ban-sshd src reject-with icmp-port-unreachable

Chain IN_public (2 references)
target     prot opt source               destination
IN_public_log  all  --  0.0.0.0/0            0.0.0.0/0
IN_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
IN_public_allow  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0

Chain IN_public_allow (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443 ctstate NEW

Chain IN_public_deny (1 references)
target     prot opt source               destination

Chain IN_public_log (1 references)
target     prot opt source               destination

Chain OUTPUT_direct (1 references)
target     prot opt source               destination
[root@SAKURA_VPS ~]#

 

特に問題はなさそうです。

 

調べてみましたが、現在のところ原因不明なので先に進めます。

 

■解放ポートの確認

httpsが開放されていることを確認します。

[root@SAKURA_VPS ~]#  firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http https ← httpsも開放されています。
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

 

 

DNSの設定(グローバルIPアドレスとドメイン名の紐付)

  • ドメイン名(FQDN):box-cm.com
  • グローバルIPアドレス:160.16.217.115

「160.16.217.115」と「box-cm.com」を結び付けます。

 

「さくらのVPS」に「お名前.com」で取得した独自ドメインを割り当てる手順

 

 

今回はさくらVPS提供のネームサーバー(DNSサーバー)を利用せずに「お名前.com」のネームサーバー(DNSサーバー)で名前解決をする方法を選択します。

 

お名前.comの「ドメインNavi」にログインする

お名前.comの「ドメインNavi」にログインします。

https://www.onamae.com/navi/domain.html

 

以下のログイン画面が表示されるので

  • お名前ID(会員ID)
  • パスワード

を入力して「ログイン」ボタンをクリックしてログインします。

 

「ドメインNavi」にログインしたら「ドメイン設定」タブをクリックします。

 

 

以下の「このサイトを離れてもよろしいですか?」の確認画面が表示されたら「このページを離れる」ボタンをクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

左側ペインより「ネームサーバーの設定」-「DNS関連機能の設定」をクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

 

下図のように対象のドメインにチェックを入れて「次へ進む」ボタンをクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

 

下図のように「DNSレコード設定を利用する」「設定する」ボタンをクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

下図のように紐付したい「ドメイン」「IPアドレス」を設定します。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

IPアドレスを設定したら下の方にスクロールをして「確認画面へ進む」ボタンをクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

DNSレコードの設定を確認して「設定する」ボタンをクリックします。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

 

下図のように「DNSレコード設定」「完了」になっていることを確認します。

【さくらVPS】【Python】Django で Web アプリを作る【Part.1】

 

 

※設定が反映されるのに大体数時間かかります。

 

 

ドメイン設定確認

以下のコマンドでドメイン設定が反映されていることを確認します。

[test@SAKURA_VPS ~]$ nslookup box-cm.com
Server:         210.188.224.10
Address:        210.188.224.10#53

Non-authoritative answer:
Name:   box-cm.com
Address: 160.16.217.115 ← 名前解決ができています。

[test@SAKURA_VPS ~]$

 

※もしうまくいかない場合は、いろいろと設定をいじらずに、数時間待ってみましょう。

 

 

まとめ

Part.1は以上で一旦完了です。

Part.2では「Let's Encrypt」を「さくらVPS」に設定して「https://box-cm.com」にアクセスできるように設定をします。

 

 

 

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。