Linux Ubuntu 未分類

Linuxサーバの初期設定(Ubuntu 16.04 LTS)

投稿日:2017年10月5日 更新日:

先日、VPS(Scaleway VCS1プラン)をレンタルし、Linuxサーバを立ち上げました。その際の初期設定について記述していきます。

環境

  • ハードウェア
    • Scaleway (VPS) VCS1プラン
    • Intel x86_64 CPU 2Cores
    • 2GB RAM
    • 50GB SSD
  • OS
    • Ubuntu 16.04 LTS

作業内容

以下の作業を行います。

  • ユーザの設定
  • SSHの設定
  • ファイアーウォールの設定

ユーザ設定

rootユーザを常用するのはセキュリティ上よろしくないため、VPS管理用一般ユーザを作成します。
今回は、以下のようなユーザ、グループを作成します。

  • ユーザ名:admin
  • グループ名:wheel

まず、wheelグループを作成します。
一般的に、wheelグループは、sudoを実行できる権限のある管理用グループとして使用されます。

root@hostname:~# addgroup wheel

adminユーザを作成し、パスワードをつけます。また、wheelグループにadminを所属させます。

root@hostname:~# useradd -m -g wheel admin
root@hostname:~# passwd admin

上記の操作でユーザとグループが適切に設定されているか確認します。

root@hostname:~# id admin
uid=(admin) gid=(wheel) groups=(wheel)

wheelグループに所属するユーザがsudoコマンドを使用できるようにするために、/etc/sudorsを編集します。
下記文に相当する部分を以下のように編集します。

# Members of the admin group may gain root privileges
%wheel ALL=(ALL) ALL

SSH設定

続いて、VPSにに対してadminユーザとしてSSH接続するための設定を行います。
今回は、SSHを使用した外部からの攻撃を防ぐため、以下の設定を行います。

  • ポート番号:22→20022へ変更(Well Known以外ならなんでも可)
  • 認証方式:パスワード認証→公開鍵認証へ変更

事前準備として、接続に使用したいクライアント側PCにて、公開鍵を作成しておきます。

client@hostname:~# ssh-keygen -t rsa

まず、ユーザを、rootから.先程作成したadminに切り替えます。

root@hostname:~# su admin
admin@hostname:~#

adminのホームディレクトリに.sshディレクトリを作成し、権限を付与します。

admin@hostname:~# cd /home/admin
admin@hostname:~# mkdir .ssh
admin@hostname:~# chmod 700 .ssh

$HOME/.sshディレクトリ以下に、authorized_keysファイルを作成し、接続に使用したいPCで作成した公開鍵の内容をコピーします。
クライアント側で公開鍵(~.pubファイル)を開き、クリップボードにコピーして、サーバ側のauthorized_keysに貼り付けると良いでしょう。
また、権限を付与します。

admin@hostname:~# chmod 600 .ssh/authorized_keys

 

sshdの設定を編集します。具体的には、/etc/ssh/sshd_configを、以下のように書き換えます。

# What ports, IPs and protocols we listen for
Port 22 → 20022に変更

(中略)

# Change to no to disable tunnelled clear text passwords
# PasswordAuthentication yes → コメントアウトを外し、noに変更

最終的に、sshd_configは以下のようになります。

# What ports, IPs and protocols we listen for
Port 20022

(中略)

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

最後に、systemctlコマンドで、sshdサービスを再起動します。

admin@hostname:~# sudo systemctl restart sshd

これで、サーバ側の設定は完了です。
実際にSSHでログインしたい場合は、クライアント側でsshコマンドを実行する際、-iオプションを使用し、引数として秘密鍵のパスを指定します。

client@hostname:~# ssh -i ~/.ssh/(秘密鍵) admin@ipaddr

おまけで、adminユーザのログインシェルを変更します。デフォルトではshになっておりますが、今回はbashに変更します。
/etc/passwdファイルのadminユーザについての情報が書かれている部分の末尾に、ログインシェルを記述します。

admin:中略::/home/admin:/bin/bash

ファイアーウォールの設定

余計なポートを開いてセキュリティホールにならないよう、iptablesを使用して公開ポートを制限し、ファイアーウォールを作成します。

admin@hostname:~# sudo iptables -A INPUT -i lo -j ACCEPT
admin@hostname:~# sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
admin@hostname:~# sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
admin@hostname:~# sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
admin@hostname:~# sudo iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
admin@hostname:~# sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
admin@hostname:~# sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
admin@hostname:~# sudo iptables -A INPUT -p tcp --dport 20022 -j ACCEPT
admin@hostname:~# sudo iptables -P INPUT DROP
admin@hostname:~# sudo iptables -P FORWARD DROP
admin@hostname:~# sudo iptables -P OUTPUT ACCEPT

1行目:自身(loopback)からのアクセスを許可します。
2行目:データを持たないパケットの接続を破棄します。
3行目:SYNflood攻撃と思われる接続を破棄します。
4行目:ステルススキャンと思われる接続を破棄します。
5行目:確立済みの通信をポート関係なく許可します。
6〜8行目:許可したいポートを選択し、コマンドを入力することで、該当のポート宛の通信を許可します。
9〜11行目:デフォルトのポリシーを設定します。OUTPUTのみACCEPTとします。

終わりに

これらの手続きは、サーバを新規に作成する場合に必ずといっていいほど行う設定だと思います。本記事をメモ代わりにし、設定を行っていただければ幸いです。

-Linux, Ubuntu, 未分類
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

systemdからdockerコンテナを起動+timerで定期実行

今回はdockerコンテナをsystemdから起動し、かつtimerを使用して定期実行する方法を紹介します。 目次1 背景2 要求と仕様3 systemdについて4 設計・実装4.1 テストアプリとs …

pthread_cancelすると何が行われるのか

仕事でのメモ。 目次1 pthread_cancel2 pthread_cancelで何が行われるのか2.1 シグナル送出2.2 注意2.3 ソースコードを読む2.4 pthread_cancel時の …

C++のマルチスレッド環境における問題とvalgrindを用いた検出方法

私は仕事でC++を使用してソフトウェアを実装しています。 今回は、C++マルチスレッドプログラミングで発生する問題点とその検出方法を(自分のメモも兼ねて)記述します。 環境は以下になっております。 O …

Docker上でnginx-proxy他を使ってSSL対応マルチドメインサーバ環境の構築

今回は、nginx-proxyを使用し、SSLに対応したマルチドメイン環境を構築します。 追記(2017/10/08):作成したdocker-compose.ymlをGithubに公開しました。目次の …

Docker上でWordPressとnginx-proxyを連携(SSL対応)

今回は、Docker上でWordpressサーバを構築し、SSLに対応したnginx-proxyとの連携を行います。 追記(2017/10/08):作成したdocker-compose.ymlをGit …