へっぽこインフラエンジニアのブログ

IT業界の最底辺からこんにちは

【Laravel】ADアカウントでログインできるようにする

参考:LaravelでAD認証を導入する - Qiita

検証時のバージョン

OS:Amazon Linux 2
Apahe:2.4
MariaDB:5.5.64
PHP:7.3
Laravel:7.27.0
Adldap2-laravel:6.1.1

プロジェクト作成

sudo chown ec2-user:ec2-user /var/www/html
cd /var/www/html
composer create-project laravel/laravel [project-name] --prefer-dist

プロジェクトフォルダ内のパーミッション変更

※Laravelが普通に動くパーミッションであれば、なんでもよいです。
参考:CentOS/Apache/Laravel使用時のpermission設定方法 - Qiita

データベース作成

mysql -u root -p
create database laravel;
exit;

DB接続情報の追加

・.env

DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=設定したパスワード

Laravelプロジェクトの日本語化

・config/app.php

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

DBマイグレーションエラー対策

※MariaDBのバージョンが新しい場合は不要
・app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema; ←追加
・・・
public function boot()
{
    Schema::defaultStringLength(191); ←追加
}

マイグレーションファイルの編集

・database/migrations/2014_10_12_000000_create_users_table.php

  $table->id();
  $table->string('name');
+ $table->string('username')->unique();
- $table->string('email')->unique();
+ $table->string('email')->nullable();
- $table->timestamp('email_verified_at')->nullable();
  $table->string('password');
  $table->rememberToken();
  $table->timestamps();

・database/migrations/2014_10_12_100000_create_password_resets_table.php は削除する

マイグレーション実行

php artisan migrate

nodejsインストール

php artisan migrate
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
npm -v

ログイン機能導入

composer require laravel/ui
php artisan ui vue --auth
npm install
npm run dev

PHP-LDAPの導入

sudo yum install -y php-ldap
sudo vi /etc/php.ini

以下を追記する

extension=ldap.so

PHPを再起動する

sudo systemctl restart php-fpm

Adldap2の導入

composer require adldap2/adldap2-laravel

・config/app.php

  'providers' => [
  ・・・
+     Adldap\Laravel\AdldapServiceProvider::class,
+     Adldap\Laravel\AdldapAuthServiceProvider::class,
  ],
  
  'aliases' => [
  ・・・
+     'Adldap' => Adldap\Laravel\Facades\Adldap::class,
  ],

Adldap2設定ファイルのパブリッシュ

php artisan vendor:publish --provider "Adldap\Laravel\AdldapServiceProvider"
php artisan vendor:publish --provider="Adldap\Laravel\AdldapAuthServiceProvider"

ldapサーバの接続設定

・config/ldap.php

'account_suffix' => env('LDAP_ACCOUNT_SUFFIX', '@example.co.jp'),
'hosts' => explode(' ', env('LDAP_HOSTS', dc1.example.co.jp dc2.example.co.jp')),
'base_dn' => env('LDAP_BASE_DN', 'dc=example,dc=co,dc=jp'),
'username' => env('LDAP_USERNAME', 'example\ldap-admin'),
'password' => env('LDAP_PASSWORD', 'password'),

※ユーザ作成/パスワード変更を実装する場合は以下も設定

'use_tls' => env('LDAP_USE_TLS', true),

ログイン周りの修正

・app/Http/Controllers/Auth/LoginController.php

  class LoginController extends Controller
  {
  ・・・
+     public function username()
+     {
+        return 'username';
+     }
  }

・config/auth.php

  'providers' => [
    'users' => [
-       'driver' => 'eloquent',
+       'driver' => 'ldap',

・resources/views/auth/login.blade.php
変更前

<div class="form-group row">
    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

    <div class="col-md-6">
        <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
        @error('email')

変更後

<div class="form-group row">
    <label for="username" class="col-md-4 col-form-label text-md-right">Username</label>

    <div class="col-md-6">
        <input id="username" type="username" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="username" autofocus>
        @error('username')

・config/ldap_auth.php
※以下を編集

  'ldap' => [
      'locate_users_by' => 'samaccountname',
      'bind_users_by' => 'samaccountname',
  ],

  'database' => [
      'guid_column' => 'email',
      'username_column' => 'username',
  ],

  'sync_attributes' => [
      'email' => 'mail',
+     'username' => 'samaccountname',
      'name' => 'cn',
  ],

ルート編集

・routes/web.php

Auth::routes();

↑を

Auth::routes([
    'reset' => false,
    'verify' => false,
    'register' => false,
]);

↑に変更する

Welcomeページから「Registerボタン」が、
Loginページから「パスワード忘れリンク」が消える。

ログインを試してみる

JR STATION WORK でテレワークしてみた(ホテルメッツ高円寺)

憎き新型コロナウィルスの影響でテレワークの流れができ、
それに便乗するように様々なテレワーク応援キャンペーンが現れた。

今回はその一つと思われる(?)JR東日本の「STATION WORK」を使ってみたのでご紹介する。

STATION WORK は大きく分けて2種類

自宅や職場以外でも仕事ができるのが売りのSTATION WORK。
大きく分けて2種類が存在する。

※最新の情報は公式サイトで確認してください。

1. 駅内にあるボックス

駅構内にある1~2人が入れるほどのボックスで、中で仕事ができる。
外部ディスプレイやコンセントがあり、PCを使った仕事が快適にできるようになっている。

東京、新宿、品川駅など主要な一部の駅に設置されているらしい。

2. ホテルを利用するタイプ

JRと連携しているホテルの客室で仕事ができる。
ホテルの立地も駅に近いため、ビジネスにピッタリである。

渋谷、五反田、秋葉原などで利用できる模様。

今回はホテルタイプを利用

ホテルタイプには様々なプランがあり、午前・午後・一日から選べる。
今回は午後(12:00~19:00)で、税込み 3,520円 のプラン。

ホテルメッツ高円寺は、高円寺駅の北口を出て徒歩10秒で入口がある好立地。
もっとも、ホテルメッツの1階が高円寺駅、という表現のほうが正しいのだが。

今回の部屋は5階。客室としては最も低い階と思われる。

f:id:fujison-xyz:20200809141417j:plain
部屋の中はこんな感じ

また、今回のプランにはいくつかの制限がある。
・ベッド利用不可
・部屋の風呂、トイレ利用不可(4階の共用トイレを使用)
など。

f:id:fujison-xyz:20200809142740j:plain
利用不可の注意書き。これらを利用可能なプランもある

といっても、ほかの備品はほとんどが使ってもよいようで、

・テレビ(PCのセカンドモニタとして利用可)
・コンセント
・冷蔵庫
・有線LAN、無線LAN
・コーヒーメーカー(共用)
・電子レンジ(共用)
・プリンター(共用)

などなど、テレワークをするには申し分ない環境が整っている。

f:id:fujison-xyz:20200809162717j:plain
テレビ・冷蔵庫・デスクライト完備の机は広く、奥行きも十分。

半日テレワークしてみた感想

結果から言うと、とても良かった。
これだけだと小学生の感想になってしまうので、具体的にメリデメを挙げておく。

  • メリット
    • とても静か
      ホテル独特の静寂さはきっと想像に難くないと思いますが、まさにそれ。
      自宅と違ってインターホンも鳴らなければ、ご近所の生活音もない。
    • 立地が良い
      2階はデニーズになっており、ホテルエレベータの2階を押すだけで行くことができる。
      ほかにも駅前ゆえに食事には事欠かず、富士そば・松屋・かつや・てんやなどが徒歩1分圏内にある。
    • ネットが高速
      まぁ上り下りが40Mbps程度なので中の下といったところだが、カフェやマックなどのフリーWiFiに比べると非常に高速であるといえる。
    • コロナの心配がほぼゼロ
      当然ながら清掃が行き届いており、ほかに人もいない。
      マスクをして、清掃されたかも怪しいテーブルで、ほかの人との距離を気にしながらカフェでするテレワークとは雲泥の差である。
  • デメリット
    • トイレ環境が×
      ホテルメッツ高円寺のみだと思うが、トイレがフロントの階にしかなく、しかもそのトイレが大便器1個しかない。
      もっとも、部屋内のトイレを利用できるプランもあるのでお腹を下しやすい人はそっちを利用しよう。
    • ベッドの誘惑がすごい
      机から1mの距離にきれいに整えられたふかふかのベッドがあるのに、それに飛び込まずにいられようか(感じ方には個人差があります)。部屋に入るなりベッドにダイブする癖のある人は気をつけよう。(もちろん私は堪えました)
    • 机が高い
      椅子が高さ調節できないタイプ&机がやや高いので、パソコンをタイプするのがちょっとだけ辛かった。もちろん個人差はあると思いますが、身長173cmの私が正座してちょうど良いといったところ。
      別にそこまで気になる高さではないのだが、足が長くて座高が低い人はクッションなどを持参したほうがよさそう。

以上。

もはやデメリットはいちゃもんの領域であった(しかも内2つはプランを上げると解決できる)が、総合して「とても良かった」と思えた。

気乗りのしない"クソ"リモート会議が入っている日、連日のテレワークで疲弊しきった日などは、リフレッシュになるので利用してみてはいかがでしょうか。

STATION WORK の公式HPはこちら

EC2上にLaravel環境を構築してみた(2/2)

f:id:fujison-xyz:20200807101450p:plain

前回の記事でプロジェクト作成直前までの構築を行った。

本記事では「プロジェクト作成→ユーザ認証導入」を実施して動作確認を行う

バージョンはこちら

Amazon Linux 2
Apache 2.4
MySQL 5.5
PHP 7.3
Laravel 7.23.2

1. メモリ不足について

EC2インスタンスが「t2.micro」だと、プロジェクト作成時やログイン機能インストール時に
必ずメモリ不足を起こす(cannot allocate memory みたいな)。

そのため、プロジェクト作成時のみ「t2.medium」に変更することをお勧めします。
※t2.mediumの利用料金は一時間で7円程度です(最新の料金は調べてください)
※プロジェクト作成後に戻すのをお忘れなく!

↓ここから変更できる(インスタンスは停止/Stopしておく)
f:id:fujison-xyz:20200807103548p:plain

↓インスタンスタイプを変更せず、スワップ領域を作成する方法もあります
Laravel で Cannot allocate memory がでたときの対策 - Qiita

2. Laravel プロジェクトを作成する

Composerでプロジェクト作成
sudo chown ec2-user:ec2-user /var/www/html
cd /var/www/html
composer create-project laravel/laravel プロジェクト名 --prefer-dist
プロジェクトフォルダの権限変更

「プロジェクト名」は作成したものに変更する

sudo groupadd laravel
sudo usermod -aG laravel ec2-user
sudo usermod -aG laravel apache
cd /var/www/html
sudo chown -R ec2-user:laravel プロジェクト名
sudo find プロジェクト名 -type d -exec chmod 750 {} \;
sudo find プロジェクト名 -type f -exec chmod 640 {} \;
sudo chmod -R 770 プロジェクト名/storage/ プロジェクト名/bootstrap/cache/

出典:Laravelのパーミッションを適切に設定 - Qiita

ドキュメントルートを変更する(任意)

php artisan serve でテストするにはこのままでいいのだが、常時アクセスできるようにする場合は以下を実施する。

sudo vi /etc/httpd/conf.d/vhost.conf

以下をコピペする(サーバ名・プロジェクト名は各自の環境に変更する)

<VirtualHost *:80>
  ServerName hoge.example.com
  DocumentRoot "/var/www/html/プロジェクト名/public"
  <Directory "/var/www/html/プロジェクト名/public">
    AllowOverride all
  </Directory>
</VirtualHost>

以下を実行してサーバを再起動する

sudo shutdown -r now
アクセスしてみる

ひとつ前の「ドキュメントルートを変更する」を実施した人は「http://サーバ名」にアクセス。
※実施してない人はphp artisan serveを実行して(以下略

3. ユーザログインを実装する

無事にLaravelホーム画面が表示されたら、ログイン機能をインストールする。

データベース作成

最後の「laravel」はデータベース名。好きなものに変更してもよいです。

mysql -u root -p
create database laravel;
exit;
Laravel 側のDB用設定

以下のファイルを編集する

/var/www/html/プロジェクト名/.env

変更箇所は以下の通り

DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=設定したパスワード

さらに以下のファイルを編集する

/var/www/html/プロジェクト名/config/app.php

変更箇所は以下の通り

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
ログイン機能のインストール

以下のファイルを編集します。

/var/www/html/プロジェクト名/app/Providers/AppServiceProvider.php

2行、追加する

use Illuminate\Support\Facades\Schema; ←追加
・・・
public function boot()
{
    Schema::defaultStringLength(191); ←追加
}

以下でログイン機能が実装される

php artisan migrate
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
npm -v
composer require laravel/ui
php artisan ui vue --auth
npm install
npm run dev

Laravelのページをリロードすると、LoginとRegisterボタンが追加されている。
ユーザを登録したり、ログインして正常に動くか確かめる
f:id:fujison-xyz:20200807122252p:plain

以上!

おつかれっしたー
インスタンスタイプを変更してる人は、戻すのを忘れずに!

EC2上にLaravel環境を構築してみた(1/2)

f:id:fujison-xyz:20200807101450p:plain

私は基本インフラ担当なのだが、フロントチームから「Laravelの開発環境作って!」って言われてしまった。

次の記事でログイン実装までやります!

バージョンはこちら

Amazon Linux 2
Apache 2.4
MySQL 5.5
PHP 7.3

1. LAMPサーバの構築

OS時刻を日本時間に
sudo yum update -y
sudo vi /etc/sysconfig/clock
# UTC を Asia/Tokyo に変更
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
PHPインストール
sudo amazon-linux-extras install -y php7.3

以下でLaravel公式のPHP要件の最低限のものをインストールする。
※最低限なので、ほかに好きなものを入れる。

sudo yum install -y php-bcmath php-mbstring php-xml
Apache・MySQLインストール
sudo yum install -y httpd mariadb-server
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl start mariadb
sudo systemctl enable mariadb
MySQLの初期設定
sudo mysql_secure_installation
# Enter current password for root (enter for none): 何も入力せずEnter
# Set root password? [Y/n] Y
# New password: 新しいパスワードを入力
# Re-enter new password: もう一度新しいパスワードを入力
# Remove anonymous users? [Y/n] Y
# 以降もすべてYを入力する
PHPの設定
sudo vi /etc/php.ini

expose_php = Off
date.timezone = Asia/Tokyo
は最低限設定しておきたいところ。

sudo systemctl restart php-fpm

↑で変更を反映させる

2. Composerを導入

ここはインフラの領域ではないが、サービスで入れてあげることにした

cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

以上!

次回はプロジェクト作成と、依頼のあったユーザ認証をテストする。

AWS EC2上でZabbixサーバを構築してみた(Zabbix 5.0)

f:id:fujison-xyz:20200517172149p:plain

CentOS 7 + AWS EC2 環境でのZabbix 5.0の構築方法をご紹介!!!

物理サーバにZabbixはもう古い!と思う...

◆ 目次 ◆

1. EC2インスタンスを作成する

インスタンスの作成方法はググってください。
私は以下のように作成した

・CentOS 7
・t2.micro
・セキュリティグループ:アウトバウンドでSSHとHTTPを0.0.0.0/0に開放

その他はデフォルト値で。

ElasticIPの割り当ても忘れずに!
(グローバルIPが再起動の度に変わってしまいます!)

2. EC2インスタンスにSSH接続する

作成時にダウンロードした秘密鍵を使って接続する。

CentOSの場合はcentosユーザでログイン。
※ec2-userではないよ!

3. Zabbixをインストール

※紹介する手順は、一部を除き公式の手順 のパクリ と同じ。
https://www.zabbix.com/jp/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=apache

ログイン後「sudo su -」でルートユーザに切り替えます。

1. リポジトリのダウンロード
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all

※最新のリポジトリURLは以下から確認する
Zabbix Official Repository

2. Zabbix サーバーとエージェントのインストール
yum -y install zabbix-server-mysql zabbix-agent
3. Zabbix frontend のインストール
yum -y install centos-release-scl
vi /etc/yum.repos.d/zabbix.repo

↑ [zabbix-frontend]内の enabled=0 を、enabled=1 に変更する

yum -y install zabbix-web-mysql-scl zabbix-apache-conf-scl
4. MariaDBのインストール
yum -y install mariadb mariadb-server
systemctl start mariadb
systemctl enable mariadb

mysql_secure_installation
    Enter current password for root (enter for none): ← 入力せずEnter
    Set root password? [Y/n] ← Yを入力してEnter
    New password: ← DBのrootパスワードを設定
    Re-enter new password: ← もう一度パスワードを入力
※その後も色々聞かれるが、全て「Y」を入力する
5. DB周りの設定
mysql -u root -p
    Enter password: ← 先ほど設定したパスワードを入力する

ここでプロンプトが「MariaDB [(none)]>」に変化している。

create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by 'DBユーザのパスワード';
grant all privileges on zabbix.* to zabbix@localhost;
quit;
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
    Enter password: → 設定したDBユーザのパスワードを入力する
6. Zabbixの設定ファイルを編集する
vi /etc/zabbix/zabbix_server.conf

↑ 「# DBPassword=」を「DBPassword=DBユーザのパスワード」に変更

vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf

↑ 「; php_value[date.timezone] = Europe/Riga」を「php_value[date.timezone] = Asia/Tokyo」に変更

7. サービスの起動・有効化
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm

4. WEB画面での設定

WEBブラウザで「http://サーバのIPアドレス/zabbix」へアクセスする

「Welcome」画面は「Next step」で飛ばす。
「Check of pre-requisites」画面も飛ばす(サーバに問題がある場合は飛ばせない)。
「Configure DB connection」画面で「DBユーザのパスワード」を入力
後の画面は適当にNextをクリックしていく。

ログイン画面まで進んだら
Username:Admin
Password:zabbix
でログインする

5. Adminパスワードの変更

画面左下「User settings」→「Change password」とクリックし、Adminパスワードを変更する

6. ホーム画面で「Zabbix server is running」が「No」と表示される問題

f:id:fujison-xyz:20200517170913p:plain
SELinuxを無効化すると直る。
※無効化したくない場合はググって解決方法を調べる。

vi /etc/selinux/config

↑ 「SELINUX=enforcing」を「SELINUX=disabled」に変更する

shutdown -r now

でサーバを再起動する。

Zabbix server is runningがYesになっている。

終わり

構築手順は以上です。

よいZabbixライフを!

Cisco892とAWSをサイト間VPNで常時接続してみた

サイト間VPNを接続すると、各サイトからお互いにプライベートIPで接続できるようになる。

VPC内もローカルネットワークのようにアクセス可能なのですごく楽。ただし料金はかかる。

今回の環境

・ルータのグローバルIPは固定
・IOSバージョン:15.0(1)M3
・サブネットはPublicとProtectedの2つ(何個でもOK)
・各IPアドレスは以下の通り

Cisco 892 - WAN側 xxx.xxx.xxx.xxx
Cisco 892 - LAN側 192.168.32.0/24
VPC 10.0.0.0/16

AWSでのサイト間VPN設定

1. カスタマーゲートウェイの設定
VPCの管理画面内、「カスタマーゲートウェイ」を開く

「カスタマーゲートウェイの作成」をクリック

入力項目は以下の通り
・名前:適当
・ルーティング:動的
・IPアドレス:ルータのWAN側IP
※あとは入力していない

f:id:fujison-xyz:20200509190911p:plain

2. 仮想プライベートゲートウェイの設定
VPCの管理画面内、「仮想プライベートゲートウェイ」を開く

「仮想プライベートゲートウェイの作成」をクリック

名前タグを適当に付けて、作成ボタンをクリックする。

仮想プライベートゲートウェイの一覧ページに戻ったら、「アクション→VPCにアタッチ」とクリック。

VPCを選択して「はい、アタッチします」をクリック。

3. サイト間のVPN接続の設定
PCの管理画面内、「サイト間のVPN接続」を開く

「VPN接続の作成」をクリック

入力項目は以下の通り
・名前タグ:適当
・仮想プライベートゲートウェイ:さっき作ったものを選択
・Customer Gateway ID:さっき作ったものを選択
※あとは入力していない

f:id:fujison-xyz:20200509191918p:plain

サイト間のVPNの一覧ページに戻ったら「設定のダウンロード」をクリック
・ベンダー:CiscoSystems, inc.
・プラットフォーム:ISR Series Routers
・ソフトウェア:IOS 12.4+

f:id:fujison-xyz:20200509191055p:plain

ダウンロードしたファイルは後で使う

4. ルートテーブルの変更
VPCの管理画面内、「ルートテーブル」を開く

対象のルートテーブルをクリックし、以下のルートを追加する
・送信先:192.168.32.0/24(ルータのLAN側)
・ターゲット:作成したvirtual private gatawayを選択する(クリックすると出てくる)

f:id:fujison-xyz:20200509191332p:plain

※私の環境では「Public」「Protected」サブネットの2つがあったが、どちらもこの方法で接続出来た。

ルーター側での設定

ルータにTelnetもしくはSSH接続し、「3. サイト間のVPN接続の設定」でダウンロードしたテキストをペーストする

こんな感じのテキストファイル↓
f:id:fujison-xyz:20200509191406p:plain

※私の環境ではそのままで動いたが、NATトラバーサル下にルータがある場合やFWを経由している場合は変更が必要

接続確認

EC2インスタンス等のローカルIPで接続出来れば成功。

接続できない場合は、インスタンスのセキュリティグループを見直してみる。

その他にも公式のトラブルシューティング手順があるので参考までに。
docs.aws.amazon.com

良いAWSライフを!

電話でアルファベットを1文字ずつ伝えるやつ

私の中で「かっこいいな」と思うものをまとめておく。
※こういうのを「フォネティックコード」と呼ぶ。

A アメリカのA
B ブラジルのB
C チャイナのC
D デンマークのD
E イングリッシュのE
F フランスのF
G ゴルフのG
H 香港のH
I イタリアのI
J ジャパンのJ
K コリアのK
L ロンドンのL
M メキシコのM
N 日本のN
O 大阪のO
P ポルトガルのP
Q クイーンのQ
R ロシアのR
S スペインのS
T 東京のT
U USAのU
V ベトナムのV
W ワシントンのW
X X線のX
Y 横浜のY
Z ゼブラのZ

ちょっと無理やりに見える?

上記のうち「USAのU」「X線のX」などは、結構無理があるように見える。

そういったものは大抵「アルファベットのU」「アルファベットのX」と言ってしまえば伝わるので、
無理にフォネティックコードにしない方が良かったりする。

個性って大事

さらにご自身の業界用語に合わせると、より伝わりやすく、より魅力的なものになると思います。

例えば医療関係の職種なら「ドクターのD」「ナースのN」「クリニックのC」とか
IT関連の職種なら「データのD」「ヌルのN」「コンピューターのC」とか。

私の職場には「日本の地名」でほとんど全てを表す人もいます。

自分にとって最も良いと思うフォネティックコードを探すのも楽しいのでは?