投稿者: たんご・あるふぁ・まいく
新しいマザーボードに交換
現在のパソコンの構成
- マザー ASUS ROG STRIX B550-A GAMING
- CPU Ryzen9 3950X(16C32T 3.5-4.7GHz)
- メモリ DDR4 PC4-28800 3600MHz 2✕32GB=64GB
- グラフィックボード GeForce RTX™ 4070 Ti
- M.2SSD PCle4.0 NVMe M.2 Kingston KC3000 1021GB PCIe Gen 4.0 x4 70000MB/S
- M.2 SSD PCIe Gen4x4 NVMe M.2 diloca EN760 2TB 2280 4800MB/s
- 電源 MSI 750W MAG A750GL PCIE5 PS1326
・PCIe 5.0 GPU ネイティブ16ピン(12VHPWR)450W対応
・ATX 3.0 対応/フルモジュラー設計
・80 PLUS Gold認証取得 - ケース NZXT(CA-H510E-B1)


ログインに関するセキュリティ
1.ログインに関するセキュリティ
SaaS運用に向けたセキュリティ強化として、フェーズ1(必須項目)の完了およびフェーズ2の主要項目を実装した。
1-1. HTTPS強制(フェーズ1)
- iPadのChromeブラウザでログインフォーム送信時に「送信されている情報は保護されません」の警告が表示されていた。
- XサーバのSSL化は設定済みだったが、LaravelのURL生成がHTTPになっていた。
① `app/Providers/AppServiceProvider.php` に追記
“`php
use Illuminate\Support\Facades\URL;
public function boot(): void
{
if (!app()->environment(‘local’)) {
URL::forceScheme(‘https’);
}
}
② `bootstrap/app.php` にTrustProxies設定を追加
“`php
$middleware->trustProxies(at: ‘*’);
“`
結果
- iPadでの警告が解消された。
- ローカル環境(HTTP)では適用しない条件分岐を追加し、ローカルの動作も正常化。
1-2. セッションのセキュア設定(フェーズ1)
本番・ローカル各.envに以下を追記:
| 項目 | 本番 | ローカル |
| SESSION_SECURE_COOKIE | true | false |
| SESSION_ENCRYPT | true | true |
| SESSION_SAME_SITE | strict | lax |
結果
- セッションCookieのHTTPS限定送信を設定。
- セッションデータの暗号化を有効化。
- 既存ログインユーザーのセッションが一度無効化されたが、再ログインで正常動作を確認。
1-3. ログイン失敗のロック機構(フェーズ1)
app/Http/Requests/Auth/LoginRequest.php を確認した結果、Laravel標準のRateLimiterによる以下の機能がすでに実装済みであることを確認した。
- 5回失敗でアカウント一時ロック
- メール+IPアドレスの組み合わせでカウント
- 時間経過で自動解除
- Lockoutイベントの発火
結果
- 追加実装不要。実装済みを確認。
1-4. セキュリティヘッダーの実装(フェーズ2)
app/Http/Middleware/SecurityHeadersMiddleware.phpを新規作成し、bootstrap/app.php` に登録。
設定したヘッダー:
| ヘッダー | 設定値 | 効果 |
| Strict-Transport-Security | max-age=31536000 | HTTPS強制をブラウザに記憶 |
| X-Frame-Options | DENY | クリックジャッキング防止 |
| X-Content-Type-Options | nosniff | MIMEタイプ誤判定防止 |
| Referrer-Policy | strict-origin-when-cross-origin | URL漏洩防止 |
| Content-Security-Policy | self + unsafe-inline | XSS対策 |
注意事項
- ローカル環境(APP_ENV=local)では全ヘッダーをスキップする条件を追加。
- TipTapエディタ・Axios使用のため、CSPは段階的に厳格化する方針とした。
1-4. セキュリティヘッダーの実装(フェーズ2)
app/Http/Middleware/SecurityHeadersMiddleware.hpを新規作成し、bootstrap/app.php` に登録。
設定したヘッダー:
| ヘッダー | 設定値 | 効果 |
| Strict-Transport-Security | max-age=31536000 | HTTPS強制をブラウザに記憶 |
| X-Frame-Options | DENY | クリックジャッキング防止 |
| X-Content-Type-Options | nosniff | MIMEタイプ誤判定防止 |
| Referrer-Policy | strict-origin-when-cross-origin | URL漏洩防止 |
| Content-Security-Policy | self + unsafe-inline | XSS対策 |
注意事項
- ローカル環境(APP_ENV=local)では全ヘッダーをスキップする条件を追加。
- TipTapエディタ・Axios使用のため、CSPは段階的に厳格化する方針とした。
1-5. 不審ログイン通知メール(フェーズ2)
新しいIPアドレスからのログインを検知し、登録メールアドレスへ通知メールを自動送信する機能を実装。
新規作成ファイル
app/Mail/SuspiciousLoginMail.php
resources/views/emails/suspicious_login.blade.php
resources/views/emails/suspicious_login_text.blade.php(HTML/テキスト両形式対応)
修正ファイル
app/Http/Controllers/Auth/AuthenticatedSessionController.php
検知ロジック:
$isNewIp = !LoginLog::where(‘user_id’, $user->id) ->where(‘ip_address’, $request->ip()) ->where(‘id’, ‘!=’, $log->id) ->exists(); if ($isNewIp && $user->email) { Mail::to($user->email)->send( new SuspiciousLoginMail($user, $request->ip(), now()->format(‘Y年m月d日 H:i’)) ); }
メール設定
| 環境 | 設定 |
| 本番 | Xサーバ SMTPサーバ(sv13426.xserver.jp:587) |
| ローカル | MAIL_MAILER=log(ログファイルに出力) |
動作確認結果
- Gmail:受信トレイに正常届を確認 ✅
- MSN(Outlook):迷惑メールフォルダに届くことを確認 ✅
残課題
MSN/Outlookの迷惑メール判定を解消するため、DNSへのSPFレコード追加を推奨。
レコード種別:TXT
値:v=spf1 include:xserver.jp ~all
2.フェーズ別進捗
フェーズ1(必須・リリース前)
| 項目 | 状態 |
| パスワードのハッシュ化(bcrypt) | ✅ 完了(実装済み確認) |
| HTTPS強制 | ✅ 完了 |
| セッションのセキュア設定 | ✅ 完了 |
| ログイン失敗のロック機構 | ✅ 完了(実装済み確認) |
フェーズ2(リリース後早めに)
| 項目 | 状態 |
| セキュリティヘッダー(HSTS等) | ✅ 完了 |
| 不審ログイン通知メール | ✅ 完了 |
| SPF・DKIMの設定 | ⬜ 未対応(推奨) |
| パスワードリセットフローの強化 | ⬜ 未対応(次回 |
下関四日目 新しいマザーボード
下関三日目
下関二日目
下関に出張 昼から仕事
MACmini4にLaravelローカル環境構築
パソコンのエラー
メインパソコンのエラー
沖永良部から広島に
建設アシストセキュリティ監査
1. セキュリティ監査の実施
iso_app (建設アシスト)のセキュリティ強化を実施する
1.1 監査方法
Claude Code(Opus 4.7)を「セキュリティ監査員」として起用し、以下の観点でアプリケーション全体を調査しました。
- 認証・認可の漏れ(全コントローラーを網羅的に調査)
- テナント分離の実装状況(マルチカンパニー対応の確認)
- ファイルアクセス制御
- AI API への機密情報送信リスク
- 入力検証・出力エスケープ
- 依存ライブラリの脆弱性
1.2 監査サマリー
| 重大度 | 件数 | 対応状況 |
| Critical | 6件 | 4件完了・2件対応中 |
| High | 8件 | 7件完了・1件対応中 |
| Medium | 2件 | 計画中 |
| 合計 | 16件 | 11件完了 |
3. High 項目の詳細
| 項目 | コントローラー | 内容 | 状態 |
| 認可漏れ | ChecklistController | getEvidence で他社データをJSON取得可能 | ✅ 完了 |
| 認可漏れ | EnvironmentController | index/edit/save/aiEstimate でテナント確認なし | ✅ 完了 |
| 認可漏れ | RiskAssessmentController | downloadAttachment で他社ファイルダウンロード可能(16メソッド) | ✅ 完了 |
| AI情報 | AuditAiService | 被監査対象名・業務概要がAPI送信される | ⚠ 対応中 |
| AI情報 | SafetyPatrolController | 作業内容・使用機械の詳細が送信される | ⚠ 対応中 |
| AI情報 | risk_assessment.blade.php | 下請業者名・プロジェクト名がプロンプトに含まれる | ⚠ 対応中 |
4. 是正処置の内容
4.1 共通トレイトの新規作成
認可ロジックを一元化する AuthorizesTenantAccess トレイトを作成しました。
app/Http/Controllers/Concerns/AuthorizesTenantAccess.php
このトレイトにより:
- 認可ロジックが1箇所で管理される
- 各コントローラーへの適用が use 一行で済む
- 将来の Policy 移行への布石となる
- 役割ベースの例外(システム管理者は全社アクセス可)を正しく処理
4.2 適用したコントローラーと保護されたメソッド数
| コントローラー | 保護メソッド数 | 対応回 |
| ProjectController | 8メソッド | 第1回 |
| ConstructionPlanController | 15メソッド | 第1回 |
| SafetyPatrolController | 14メソッド | 第1回 |
| ChecklistController | 6メソッド | 第1回 |
| EnvironmentController | 4メソッド | 第2回 |
| RiskAssessmentController | 16メソッド | 第2回 |
| 合計 | 63メソッド | ー |
4.3 テストケース(26件 全PASS)
各コントローラーに対して以下のパターンを網羅的にテスト:
- 他社ユーザーが各リソースにアクセス → 403
- 自社ユーザーがアクセス → 200(正常)
- role=1 システム管理者 → 全社アクセス可(200)
- 削除・変更系でDBの状態が変わらないことを確認
4.4 実施コストと効果
| 項目 | 内容 |
| 実施時間(合計) | 約2時間半 |
| API利用コスト | $6.51(約1030円) |
| 外注した場合の市場価格 | 130〜350万円相当 |
| コスト比 | 約1300〜3500倍の費用対効果 |
| コード変更量 | 673行追加、12行削除 |
| テスト件数 | 26件 全PASS |
2. Critical 項目の詳細
2.1 テナント分離の欠落(Critical 1〜4) ✅ 完了
最も重大な問題でした。URL のIDを変えるだけで他社のデータに読み取り・編集・削除アクセスが可能な状態でした
| 対象コントローラー | 影響範囲 | 重大度 |
| ProjectController | show/edit/update/destroy/editOverview/updateOverview/uploadPhoto(8メソッド) | Critical |
| ConstructionPlanController | downloadDocx/downloadXlsx/generatePdf/diagramEditor等(15メソッド) | Critical |
| SafetyPatrolController | create/store/index/show/destroy/generateAiChecklist等(14メソッド) | Critical |
| ChecklistController | deleteEvidence/getEvidence等(6メソッド) | Critical |
2.2 AI API への機密情報送信(Critical 5〜6) ⚠ 対応中
発注者名・予算・下請業者名・近隣企業名などが、マスキングなしで Anthropic Claude API に送信される可能性がありました。
【現状の評価(設計意図の確認後)】
現状のAI利用は「チェックボックス選択による固定語彙のみを送信」という設計になっており、実質的な機密情報漏洩リスクは低い状態です。ただし、将来の機能拡張で誰かがフリーテキストを送る実装をしてしまうリスクの予防として、コードレベルのガード機構を実装予定です。
5. 進捗状況
| フェーズ | 内容 | 状態 |
| Phase A | リスクアセスメント(自主監査) | ✅ 完了 |
| Phase B-1 | Critical 1〜4 テナント分離 | ✅ 完了 |
| Phase B-2 | High 7〜9 認可漏れ(Environment, RiskAssessment) | ✅ 完了 |
| Phase B-3 | Critical 5〜6, High 10〜12 AI関連 | ⏳ 次フェーズ |
| Phase B-4 | Medium 13 ファイル名処理 | ⏳ 後ほど |
| Phase C | AIゲートウェイ構築・匿名化 | 📅 来月 |
| Phase D | 監視・運用体制の確立 | 📅 数ヶ月後 |
| Phase E | 継続的改善(PDCA) | 継続 |
6. 次フェーズの計画
6.1 AI送信情報のガード機構(InputValidator)
現在の「固定語彙のみ送信」という設計意図をコードで強制するバリデータークラスを実装します。
- 会社名・個人名らしき文字列の検出
- 長い数字列(電話番号・契約番号等)の検出
- 検出時の警告ログ記録
- 既存のAI Serviceへの組み込み(5箇所)
6.2 将来計画:ローカル AI 前処理
契約事項・技術的背景・経営内容の文書化を扱う際、自前サーバーに置いたローカルAIで一般化処理をしてから外部AIに送信する仕組みを構築予定です。
- ルールベース匿名化サービス(Phase 1): 氏名・会社名・金額の自動マスキング
- ローカルLLM検証(Phase 2): Ollama + Llama 3.2 などで自前AIの感触をつかむ
- 統合AIゲートウェイ(Phase 3): 匿名化→外部AI→復元のパイプライン構築
Claude Code 最適化
1. プロジェクト容量の実測結果
Claude Codeのトークン消費がものすごい・・・いくら請求が来るやら(トークン量は1億となっていた!!)、これは大変なのでトークン削減・コスト最適化の実践を考える
iso_app プロジェクトの容量分析結果(2026年5月実測):
| フォルダ | サイズ(MB) | 分類 | 除外対象 |
| node_modules/ | 103.25 | npmライブラリ | ✅ 除外必須 |
| vendor/ | 73.14 | Composerライブラリ | ✅ 除外必須 |
| storage/app/ | 59.91 | 写真・添付ファイル | ✅ 除外必須 |
| storage/logs/ | 4.33 | ログファイル | ✅ 除外必須 |
| storage/fonts/ | 5.87 | IPAexフォント | ✅ 除外必須 |
| storage/framework/ | 0.27 | Laravelキャッシュ | ✅ 除外必須 |
| public/ | 18.39 | ビルド成果物・画像 | ⚠ 一部除外 |
| resources/ | 1.32 | ビュー・CSS・JS | ❌ 必要(含める) |
| database/ | 0.86 | マイグレーション | ❌ 必要(含める) |
| app/ | 0.38 | 実コード | ❌ 必要(含める) |
⚠ 実コード(app/, resources/, database/, routes/, config/)の合計はわずか 2.7MB。全体の 1% です。
2. .claudeignore の設定
.claudeignore ファイルをプロジェクトルートに作成することで、Claude Code が読み込む対象を 268MB から 2.7MB に削減できます。
依存ライブラリ(最重要)
vendor/
node_modules/
アップロードされた写真・添付ファイル(iso_app固有)
storage/app/public/photos/
storage/app/public/evidence/
storage/app/public/plans/
storage/app/public/ra_attachments/
Laravelキャッシュ・ログ
storage/logs/
storage/framework/
storage/fonts/
ビルド成果物
public/build/
public/storage/
手書きCSSは含める
!public/css/print-common.css
Git・IDE
.git/
.idea/
.vscode/
バイナリ・大容量ファイル
*.zip *.tar.gz *.pdf *.xlsx *.sql *.sqlite
沖永良部で仕事2日目
沖永良部で仕事1日目
南の島に出張
Laravel 基礎知識
1. Laravel とは
Laravel は PHP で書かれたオープンソースの Web アプリケーションフレームワークです。2011 年に Taylor Otwell によって作られ、現在では PHP フレームワークの中で最も人気のあるものの一つとなっています。MVC(Model-View-Controller)アーキテクチャを採用しており、ビジネスロジック・データ・表示を分離して開発できます。
1.1 主要な機能
| 機能 | 説明 |
| Eloquent ORM | データベース操作をオブジェクト指向で直感的に扱える。SQLをほとんど書かずにDB操作が可能 |
| Blade テンプレート | シンプルかつ強力なテンプレート構文。HTMLとPHPを綺麗に分離 |
| Artisan | コマンドラインツール。コードの自動生成・マイグレーション・キャッシュクリアを効率化 |
| ルーティング | Route::get(‘/users’, …) のような直感的な記述でURLとコントローラーを結びつける |
| 認証(Auth) | ログイン・登録・パスワードリセットなどの認証機能を標準装備 |
| マイグレーション | データベース構造のバージョン管理 |
| キューと スケジューラ | 非同期処理・タスクの定期実行 |
2.Composer による依存管理
2.1 Composer とは
Composer は PHP の依存管理ツールです。JavaScript の npm、Python の pip に相当します。Laravel 自体も Composer を使ってインストール・管理されます。「アプリの部品調達係」と考えると理解しやすいです
2.2 Composer の3つの役割
- 買い物リストの管理: composer.json = 「このアプリに必要な部品リスト」
- 部品の調達と配置: Packagist からライブラリを取得して vendor/ に配置
- 部品同士の互換性チェック: バージョン矛盾がないか自動確認
2.3 ライブラリの所在
| 場所 | 役割 |
| Packagist (packagist.org) | PHPライブラリのカタログ(Amazonのサイトに相当) |
| GitHub | 実際のソースコードの置き場所(Amazonの倉庫に相当) |
| vendor/ フォルダ | あなたのPCに取ってきた完成品(自宅に届いた荷物) |
| ローカルキャッシュ | 一度落としたものの控え(物置に置いてある予備) |
2.4 よく使うコマンド
composer install # composer.lock通りにインストール
composer update # 制約内で更新
composer require guzzlehttp/guzzle # 新規パッケージ追加
composer remove vendor/package # パッケージ削除
composer dump-autoload # オートローダーの再生成
日曜日も天気が良い


建設アシストのコードが多くなってきたので、Claude Codeのトークン消費が多くなってくる(毎回、コードを読み込んで応答するため)・・・2日ごとにクレジット要求が来るようになったので、今噂のchatJPのClaude Code向けのプラグインであるCodexをインストールをして、さっそく工事管理のフロントエンドを修正させたが、ずいぶん時間がかかり、おまけにClaude codeも消費しているようで、またクレジットが切れてしまった・・・いくら請求が来るのか戦々恐々・・・Codexが使えるようであればFreeから契約するかと思っていたが、もう少し様子をみる必要がある・・・・Claude Codeを使わなくても、Clude,Geminiなどでもコード作成はできるが、スピードとシステム全体の網羅性はClaude Codeを使いだすと数倍以上に効率が良いため、中々戻れない
天気が良い日が続く
内部監査システムを構築
京橋川の散歩
茶菖蒲 内部監査システムの構築
甲斐犬のキク
元宇品の森を歩く
キクと朝の散歩
元宇品の散歩とバラの花
元宇品を散歩
カキツバタ
吉和にドライブ
岩谷観音に登る
昨日に続き、天気が良いので、朝のキクの散歩を兼ねて、岩谷観音を登る・・良く登っていた山だが、記録を調べてみると2020/11/16が最後のようだ・・・途中の車の中で、朝食のおにぎりを食べて、水分峡の駐車場に車を停める、いつもは水分峡の入口から直行で登るが、今日は勾配の楽な道隆寺の霊場から登り始める・・やはり膝に力が入らないので、ゆっくりと休みながら登る・・・GWなので登山者も多い・・・久しぶりの山頂(標高400mほど)は快晴で気持ちが良い・・・広島市内が良く見えて展望が素晴らしい・・・9:47から登り始めて山頂は11:23で、90分かかって登ったとことになる
下りは、同じ道を下るが、下りの方が足が痛い
フラフラになって車に到着(11500歩)・・・家に帰り、我が家の温泉で体を癒す・・・でもかなりの筋肉痛
















































































