ランサーズ等のサービスを開発・運用する中で得た知識やノウハウを紹介しています。

Labels:  AWS, DevOps 投稿者:kojima

EC2 SSH サーバ ごった煮 〜 Google Authenticator + ChatWork 通知 入り

こんにちわ。

Lancers のバックエンドの開発と運用担当の こじま です。

 

みなさん,サーバをどのようにリモートしていますか?

直接,ターゲットのサーバへログインせず

SSH サーバを経由してリモートすることが多いと思います。

SSH サーバを構築することで

不要なリソース解放を防ぎ安全にインターネット経由でリモートできます。

 

今回は,そんな SSH サーバの構築例を紹介します。

AWS EC2 環境下で以下のような機能を盛り込みます。
※ Amazon Linux AMI 2014.03.2 (HVM) – ami-29dc9228 を利用

  1. ワンタイムパスワード認証
  2. 自動ログアウト
  3. アカウントロック
  4. コマンド実行履歴保存
  5. SSH ログイン通知(ChatWork株式会社様 chatwork を利用)

 

さっそく,サーバに SSH ログインして,構築を進めましょう。

 

まず,RPM パッケージのアップデート・インストールをします。

$ sudo sed -i ‘s/enabled=0/enabled=1/’ /etc/yum.repos.d/epel.repo
$ sudo yum -y update
$ sudo yum install -y git subversion screen emacs vim lv lynx sl curl zsh banner bind-utils lsof cowsay strace tcpdump mercurial make gcc pam-devel expect bash-completion

 

ログインメッセージをかえます。誤ったサーバログインを防ぐ事ができます。

/etc/motd を更新しても再起動時に上書きされるため

/etc/update-motd.d/30-banner を更新します。

バナーは “ascii banner generator” をキーワードに

ジェネレータツールサイトを検索して作成ください。

$ sudo vi /etc/update-motd.d/30-banner

#!/bin/sh
version=$(rpm -q --qf '%{version}'system-release)
cat << EOF
  _
 | |     __ _ _ __   ___ ___ _ __ ___
 | |    / _\` | '_ \ / __/ _ \\ '__/ __|
 | |___| (_| | | | | (_|  __/ |  \\__ \\
 \_____/\\__/_|_| |_|\\___\\___|_|  |___/
 
https://aws.amazon.com/amazon-linux-ami/$version-release-notes/
EOF

 

オペレーションミスを起こさないよう

プロンプトも分かりやすいものに変更します。

$ sudo vi /etc/profile.d/prompt.sh
PS1='(\[\033[31m\]PRD\[\033[m\])\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ ‘

 

ランサーズではこんな感じのプロンプトです。

prompt

  • 本番環境
    • PRD
  • ステージング環境
    • STG
  • テスト環境
    • TEST
  • 社内開発環境
    • DEV

 

自動ログアウトするようにします。

$ sudo vi /etc/profile.d/tmout.sh

export TMOUT=3600

 

SSH ログインを chatwork に通知するようにします。

$ sudo vi /etc/ssh/sshrc

/usr/bin/curl --connect-timeout 5 -s -X POST -H "X-ChatWorkToken:<TOKEN>"-d "body=[info][title]$HOSTNAME - Login[/title]$USER has logined.[/info]""https://api.chatwork.com/v1/rooms/<room>/messages"> /dev/null

 

こんな感じの通知がきます。

chatwork

 

ワンタイムパスワード認証の設定します。

$ wget https://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2

$ tar -jxvf libpam-google-authenticator-1.0-source.tar.bz2
$ cd libpam-google-authenticator-1.0-source && make
$ sudo make install
$ sudo echo'auth required pam_google_authenticator.so'>> /etc/pam.d/sshd
 
$ sudo vi /etc/ssh/sshd_config
- #ChallengeResponseAuthentication yes
- ChallengeResponseAuthentication no
 
+ ChallengeResponseAuthentication yes
+ #ChallengeResponseAuthentication no
 
+ Port ????? <--- 1024 以降の番号にする。ポート変更時は AWS セキュリティポリシーの変更が必要です。
+ Protocol 2
+ PermitRootLogin no
+ Banner none
+ PasswordAuthentication no

 

アカウントロックの設定をします。

5回パスワードを間違えると180秒間アカウントロックされます。安心ですね

$ which pam_tally2

/usr/sbin/pam_tally2 <--- pam_tally2 が存在することを確認
$ sudo vi /etc/pam.d/sshd
+ auth required pam_tally2.so deny=5 onerr=fail unlock_time=180
 
ロック時の解除は以下の通り
$ sudo pam_tally2 -u <user-id> --reset

 

コマンド実行履歴を保存するよう設定します。

$ sudo yum install -y psacct
$ sudo chkconfig psacct on

$ sudo chkconfig –list psacct
psacct          0:off   1:off   2:on    3:on    4:on    5:on    6:off

$ sudo /etc/init.d/psacct start
プロセスアカウントを開始中:                                [  OK  ]

 

以下のようにユーザを限定して履歴参照やアカウント別利用統計も参照可能です。

$ sudo lastcomm --user <user-id>

sl                      <user-id> pts/0      0.00 secs Thu Aug 14 08:53
ls                      <user-id> pts/0      0.00 secs Thu Aug 14 08:53
bash               F    <user-id> pts/0      0.00 secs Thu Aug 14 08:53
id                      <user-id> pts/0      0.00 secs Thu Aug 14 08:53
$ sudo sa -m
root                                  610  275703.50re       0.08cp    22134k
<user-id1>                             64       2.41re       0.00cp    28133k
<user-id2>                             32       0.12re       0.00cp    28133k
<user-id2>                             32       0.10re       0.00cp    27304k
sshd                                    7       3.10re       0.00cp    19824k
postfix                                 6 2336935.38re       0.00cp    22197k

 

アカウントにワンタイムパスワードを設定します。

$ sudo passwd <user-id>

$ sudo su - <user-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-id@hostname%3Fsecret%
Your newsecret key is: ??????
Your verification code is ??????
Your emergency scratch codes are:
  ??????
  ??????
  ??????
  ??????
 ??????
Do you want me to update your "/user-id/.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 oreven prevent man-in-the-middle attacks (y/n) y
By default, tokens are good for30 seconds andin order to compensate for
possible time-skew between the client andthe server, we allow an extra
token before andafter the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to doso (y/n) y
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting forthe 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

 

今日はここまでです。以上で構築完了です 。

今回の構築で,安全にどこからでもリモートできるようになりました。

 

Lancers では,徹底したユーザ第一主義を行動指針の一つに掲げ

発注者様、受注者様、運営メンバーを含めた三者にとっての

win-win-win を創り出すことを徹底的に第一に考えます。

見えにくい部分ではありますが,Lancers のバックエンドは

ユーザ第一主義に基づき,こうした小さな環境構築から

努力の積み重ね,日々,サービス品質の向上を目指しています。

 

以上,Lancers のバックエンドを支える,こじま からでした。

機会があればまた紹介させて頂きます!

ランサーズではサービスを成長させてくれるエンジニア、デザイナーを募集しています!
ご興味がある方は、以下URLよりご応募ください。


【中途採用】
サービスリードエンジニア
テックリード(アーキテクト)
フロントエンドエンジニア
サーバーサイドエンジニア
業務エンジニア(社内システム基盤・基幹システム)

【インターン・学生バイト】
19新卒対象サマーインターン
エンジニアインターン

その他採用情報

関連記事

thumbnail
Web開発チームをタスクボードだけで見える化する 5つのコツ

ランサーズでは、現在、Webエンジニアを募集しています。 詳しくは、募集要項をご覧下さい。 はじめまして。今月からランサーズにJOINしましたkeiと申します。 長らく更新が滞っていた本ブログですが、これから定期的に情報発信していこうと思ってますので、どうぞよ …

CloudFront
EC2オリジンのCloudFrontで静的ファイルをキャッシュした話

ランサーズ Advent Calendar 2017 11日目の記事です。 インフラエンジニアの金澤です。 CloudFrontでサムネイルをキャッシュした話に続きまして、静的ファイルをキャッシュした手順も記録として残しておきたいと思います。 導入に至った経緯 …

ランサーズ リリースシステム 〜 Jenkins + Fabrics

こんにちわ。エンジニアの こじま です。 今回は,ランサーズのリリースシステムの紹介をします。 弊社プラットフォームは,1日に多い時は10回以上のコードのリリースを実施します。 ユーザ様によりよいプラットフォームを提供すべく日々,リリースをし改善を実施していま …