Bcryptとは

Bcryptとは?
– Blowfish暗号を基盤としたパスワードハッシュアルゴリズム
– 一般にパスワードは一方向性関数の性質を持つハッシュ関数を用い値ハッシュ値で保管する

ハッシュする際に、ソルトとストレッチングを実施する

ソルトとは
-> パスワードに付与するランダムな文字列
-> レインボーテーブル攻撃だと、ソルトが付与されているハッシュ値だと推測できない
-> ソフトはユーザ毎にランダムな値で生成することが望ましいとされている

ストレッチング
-> ハッシュ関数を用いてハッシュ値への計算を数千回〜数万回繰り返し実施
弱いパスワードや文字数が長くないパスワードは総当たり攻撃(ブルートフォース攻撃)などで時間をかければ元のデータを推測されてしまう可能性がある

“hogehogehoge”をbcryptでハッシュ化してみる
$2y$10$WjqfZuhkX4nwfkdlB0Itxu.Vr2EcIcNJlGbhkyOVfWDhtCO9zMSSa
$2yはハッシュアルゴリズムのバージョンを示す。2, 2a, 2b, 2x, 2yなどがある
$10はストレッチングの回数

ソルト(22文字)
ストレッチング回数の後の128ビット(22文字)がソルト
ソルトの後の184ビット(31文字)は結果のハッシュ値

なるほどどういう仕組みか大まかな概要は理解した。
ストレッチングの回数を変更してもアルゴリズムは変わらないはずだから、phpのbcrypt(password_hash)のストレッチングが10(2の10乗で1024回)でも12(2の12乗)でも元が同じならログインできるでOK?

[AWS S3Client] ListObjectsで1000件以上取得する書き方

Aws\S3\S3Clientで画像を取得する際に、1000件を超えると、1000件までしか取得できない。

-> ListAllObjectsを使おうとするとエラーになる。
-> $s3client->getPaginatorを使用する。

$s3client = new Aws\S3\S3Client([
    'credentials' => [
        'key' => $key,
        'secret' => $secret,
    ],
    'region' => 'ap-northeast-1',
    'version' => 'latest',
]);

$results = $s3client->getPaginator('ListObjects',[
    'Bucket' => $bucket,
    'Prefix' => $prefix,
    'Delimiter' => "/"
]);


$list = array();

foreach ($results as $result) {
    foreach($result["Contents"] as $object) {
        if(substr($object['Key'],-1,1) != "/"){
            array_push($list, substr($object['Key'], 4));
        }
    }
}
echo count($list);

$ php app.php
1069

参考ページ: https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_paginators.html

焦るがなー 画像ファイル側に何かあったのかと思って冷や汗かいたわ。

systemctl startを実行するshellを書いてcronで実行する

まず、hello deamonはdeactiveの状態
$ sudo systemctl status hello

### shellを書く
exe.sh

#!/bin/sh
 
LOG=`sudo systemctl start hello`

$ sudo chmod 0755 exe.sh

### shell実行
$ sh exe.sh

$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2021-01-20 10:58:55 JST; 21s ago
Main PID: 7450 (hello.sh)
CGroup: /system.slice/hello.service
├─7450 /bin/bash /home/vagrant/dev/test3/hello.sh
└─7472 sleep 1

1月 20 10:58:55 localhost systemd[1]: Started hello daemon.
1月 20 10:58:55 localhost systemd[1]: Starting hello daemon…

### crontabでshellを実行
$ sudo vi /etc/crontab

* * * * * /bin/sh /home/vagrant/dev/test3/exe.sh

$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2021-01-20 11:10:01 JST; 27s ago
Main PID: 7625 (hello.sh)
CGroup: /system.slice/hello.service
├─7625 /bin/bash /home/vagrant/dev/test3/hello.sh
└─7654 sleep 1

お、シェルで”sudo systemctl start”の実行までできました。
あとは、シェルをmysqldのプロセスが止まっていたらsudo systemctl restart mysqld.serviceにして、ec2にデプロイするだけですね。なるほど、シェルってなかなかとっつきにくいと思ってたけど、意外と便利やな。

systemctlとshellの理解を深める

### 最終ゴール
$ sudo systemctl restart mysqld.service
↑これをshellで実行したい

1.まずシェルを作ります。
hello.sh

#!/bin/bash
while true
do
	echo hello world >> /home/vagrant/dev/test3/hello.log
	sleep 1
done

2.実行権限
$ sudo chmod 0755 hello.sh

3./etc/systemd/systemの下にUnit定義ファイルを作成する
$ sudo vi /etc/systemd/system/hello.service

[Unit]
Description = hello daemon

[Service]
ExecStart = /home/vagrant/dev/test3/hello.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

L ServiceのExecStartが実行したいコマンド
L Restart=alwaysはサーバが不意に落ちた時に対応

4. Unitがserviceとして認識されたか確認
$ sudo systemctl list-unit-files –type=service | grep hello
hello.service disabled

5. 起動してステータス確認
$ sudo systemctl enable hello
$ sudo systemctl start hello
$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2021-01-20 10:35:02 JST; 14s ago
Main PID: 7220 (hello.sh)
CGroup: /system.slice/hello.service
├─7220 /bin/bash /home/vagrant/dev/test3/hello.sh
└─7235 sleep 1

1月 20 10:35:02 localhost systemd[1]: Started hello daemon.
1月 20 10:35:02 localhost systemd[1]: Starting hello daemon…

$ tail hello.log
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
$ sudo systemctl stop hello

$ sudo systemctl status hello
● hello.service – hello daemon
Loaded: loaded (/etc/systemd/system/hello.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 水 2021-01-20 10:38:06 JST; 21s ago
Process: 7220 ExecStart=/home/vagrant/dev/test3/hello.sh (code=killed, signal=TERM)
Main PID: 7220 (code=killed, signal=TERM)

1月 20 10:35:02 localhost systemd[1]: Started hello daemon.
1月 20 10:35:02 localhost systemd[1]: Starting hello daemon…
1月 20 10:38:06 localhost systemd[1]: Stopping hello daemon…
1月 20 10:38:06 localhost systemd[1]: Stopped hello daemon.

systemctl コマンドは、”systemd” をコントロールするコマンド
なるほど、systemctl restart mysqld.serviceは、mysqldのdaemonを管理してるってことね。
やっと理解した。

アラートメッセージの色(フォントカラー)を考える

アラートメッセージのフォントカラーを考える
Bootstrapを見てみる

#dc3545

#e83e8c

うーむ、まあこれでいいんだけど。。。

### Adobeカラーホイール
adobeカラーホイールで、メインカラーの関連色(類似色、モノクロマティック、トライアド、補色、二色分割、二重分割補色)などから合いそうな色を探す。

カラーホイール使うと、プロっぽくなりますね(苦笑)

[AWS RDS] バックアップサイクルと保持期間

データベース(Amazon RDS)のバックアップ設定
– バックアップサイクル 1回/日
– バックアップ保持期間 7日

このほか、RDSでは自動バックアップ(自動スナップショット)に加えて、5分毎にデータベース変更ログのアーカイブが自動で行われる

なるほど、バックアップからの復旧もカバーしとかないとあかんのか。
障害対応は神経使うな。

[Laravel8.x] simple-defaultのページネーションをカスタマイズしたい

まず、paginationでsimple-defaultを使用している時の表示

	<div class="d-flex justify-content-center">
            {!! $products->appends(request()->input())->links('vendor.pagination.simple-default') !!}
    </div>

previous, nextと表示されています。

/resources/views/vendor/pagination/simple-default.blade.php

@if ($paginator->hasPages())
    <nav>
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="disabled" aria-disabled="true"><span>@lang('pagination.previous')</span></li>
            @else
                <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a></li>
            @endif

            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a></li>
            @else
                <li class="disabled" aria-disabled="true"><span>@lang('pagination.next')</span></li>
            @endif
        </ul>
    </nav>
@endif

@lang(‘pagination.next’) はどこを読みに行っているかというと、これ。
/resources/lang/en/pagination.php

    'previous' => '&laquo; Previous',
    'next' => 'Next &raquo;',

jaにコピーします。
/resources/lang/en/pagination.php

    'previous' => '&laquo; 前へ ',
    'next' => ' 次へ &raquo;',

まあこれで良いけど、画像も試しておきたい。

画像はこちら

@if ($paginator->hasPages())
    <nav>
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="disabled" aria-disabled="true"><span></li>
            @else
                <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev"><img src="{{ asset('storage/img/left.png') }}">&nbsp;</span></li>
            @endif

            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li> <a href="{{ $paginator->nextPageUrl() }}" rel="next">&nbsp;<img src="{{ asset('storage/img/right.png') }}"></a></li>
            @else
                <li class="disabled" aria-disabled="true"><span></li>
            @endif
        </ul>
    </nav>
@endif

画像よりテキストの方が良いな

[AWS Network ACLs] ipアドレスベースでアクセス制御したい

AWS EC2で異常を検知した場合、ipアドレスベースでアクセス制御したい
セキュリティグループだと、プロトコルタイプ(http, https等)でしか制御できないが、ACLsだとipで制御できるらしい。

ACLsとは

ネットワークアクセスコントロールリスト (ACL) は、1 つ以上のサブネットのインバウンドトラフィックとアウトバウンドトラフィックを制御するファイアウォールとして動作する、VPC 用のセキュリティのオプションレイヤーです。

ほう。

rule numberの値が小さいほど、優先度が高い

Sourceでipアドレスを入力してdenyとするとアクセス拒否できる。
htaccessだとec2だけだが、ACLsだとVPS自体にアクセスできないようにできるので、良いですね。

[AWS ELB] ALBのログをS3に出力

apache2のaccess.log, error.logだけでなく、ALBのログも取得したい

1. S2にbucketを作成します。
– access-log-hoge
– permissionは Block all public access でOK

2. bucket policyを編集する
account IDで、tokyoは582318560864となる。
https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html
ap-northeast-1 Asia Pacific (Tokyo) 582318560864

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::582318560864:root"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::access-log-hoge/AWSLogs/${aws-id}/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::access-log-hoge/AWSLogs/${aws-id}/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::access-log-hoge"
    }
  ]
}

4. ALB側でaccess logをenabledにする

5. bucket
logファイルの出力を確認

うん、なんか出来てるっぽいな。

以下のようなディレクトリで出力される
Amazon S3 / access-log-hoge / AWSLogs/ ${account-id}/ elasticloadbalancing/ ap-northeast-1/ 2021/ 01/ 17/

ファイル名
${account-id}_elasticloadbalancing_ap-northeast-1_app.hoge-prd-alb.*.log.gz

gzファイルなのでdownloadして中身をみる。
うーん、timestampがUTCなのがちょっと見にくいが、そのほかはapacheのaccess.logのように確認できる