<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Development · 仁才徳</title>
    <link>https://jared.lynskey.co.nz/ja/tags/development/</link>
    <description>ソフトウェアエンジニアリングと開発組織のリーダーシップについて。評価、採用とチームの拡大、CI/CD、DevOps モニタリング、エージェンティック AI。ソウルより。</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <copyright>© 2026 仁才徳</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/ja/tags/development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>スパイクとは？アジャイル・スクラムで見積もれないストーリーの調べ方</title>
      <link>https://jared.lynskey.co.nz/ja/posts/2023/2023-10-18-spike/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/ja/posts/2023/2023-10-18-spike/</guid>
      <pubDate>Wed, 18 Oct 2023 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Managing</category>
      <category>Spike</category>
      <category>Agile</category>
      <category>Development</category>
      <category>Scrum</category>
      <category>Technical Debt</category>
      <category>XP</category>
      <category>Sprint Planning</category>
      <category>Risk Management</category>
      <description>スパイクとは、アジャイルやスクラムで誰も見積もれないストーリーがあるとき、ネックになっている問いひとつを1〜3日のタイムボックスで調べる短い調査タスクです。テクニカルスパイク（技術スパイク）とファンクショナルスパイクの違い、どんなときに有効か、どう進めるか、実際に使っているテンプレートまでまとめました。</description>
      <content:encoded><![CDATA[<p>アジャイルやスクラムでいう「スパイク」とは、ひとつの具体的な問いに答えを出すために、期間（タイムボックス）を決めて行う短い調査タスクです。たいていは1〜3日で、答えが出れば、その問いのせいで止まっていたストーリーを見積もれるようになります。成果として残るのは本番用のコードではなく、調査結果と推奨案です。作業量ではなく未知数が見積もりを阻んでいるときは、無理に数字をひねり出すより先にスパイクを回しましょう。</p>
<p>スプリントプランニングをやっていると、たまに誰もポイントを付けられないストーリーが出てきます。見積もりは2から13までバラバラ、誰かが「まあ、場合によりますね」と言い、議論は堂々巡り。<em>GraphQLとREST、どちらにするか？　システムは同時接続1万ユーザーに耐えられるのか？　このサードパーティライブラリは本番で使い物になるのか？</em>　こういう問いは、見積もりでは解決できません。実際に調べるしかない。そのためにあるのがスパイクです。</p>
<figure><video
    class="my-0 rounded-md"
    controls playsinline preload="none"
    poster="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film-poster.jpg" style="background:url('data:image/webp;base64,UklGRmoAAABXRUJQVlA4IF4AAAAQBQCdASogABIAPw1qpkemIyGYBABjEMT0gAA1cWIXGJs2LD6BmCYzHU6rXeJ2rfBgAP7ueaFWdAS7Wg/a9Absx0adTGm5KJURtiYmXfxVcs0TIltNDc4MndOlEAAA') center/cover no-repeat"
    width="1280"
    height="720"
    aria-label="この記事を語りで紹介する短い映像">
    <source src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film.webm" type="video/webm">
    <track kind="subtitles" src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film_en.vtt" srclang="en" label="English">
    <track kind="subtitles" src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film_ja.vtt" srclang="ja" label="日本語" default>
    <track kind="subtitles" src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film_ko.vtt" srclang="ko" label="한국어">
    <track kind="subtitles" src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film_vi.vtt" srclang="vi" label="Tiếng Việt">
    <track kind="subtitles" src="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/spike-film_zh-cn.vtt" srclang="zh-cn" label="简体中文">
  </video><figcaption>この記事を8分の映像にしました。ナレーションは英語で、日本語字幕が付きます。</figcaption>
</figure>


<h4 class="relative group">スパイクの出どころ
    <div id="スパイクの出どころ" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%82%b9%e3%83%91%e3%82%a4%e3%82%af%e3%81%ae%e5%87%ba%e3%81%a9%e3%81%93%e3%82%8d" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>この言葉はエクストリームプログラミング（XP）から来ていて、元々は「解決策の候補を探るためのごく単純なプログラム」を指していました。問題にスパイク（杭）を打ち込むイメージです。今の形で言えば、タイムボックスを切った短い調査タスクで、成果物は動くソフトウェアではなく「知識」。スパイクはユーザーストーリーではなく、それ自体は顧客価値を生みません。それでいいのです。役割は特定の問いにひとつ答えを出し、本来の作業をまともに見積もって計画できるようにすることです。</p>
<p>実務では2種類に分かれます。テクニカルスパイクは「どう作るか」を探るもの。フレームワークやライブラリの評価、アーキテクチャパターンのプロトタイピング、現実的な条件でのパフォーマンステスト、外部システムとの連携がどれだけ厄介かの調査などです。ファンクショナルスパイクは「何を作るか」を探るもの。曖昧なストーリーの明確化、使い捨てプロトタイプでのUI検証、ドメインの複雑さの解きほぐしなどが該当します。</p>

<h4 class="relative group">時間を割く価値がある理由
    <div id="時間を割く価値がある理由" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%99%82%e9%96%93%e3%82%92%e5%89%b2%e3%81%8f%e4%be%a1%e5%80%a4%e3%81%8c%e3%81%82%e3%82%8b%e7%90%86%e7%94%b1" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>大きな未知数を抱えたまま見積もると、結果は2つに1つです。水増しされた見積もりか、破られる締め切りか。スパイクは「わからない」を実データに変えてくれるので、チームは胸を張ってコミットできます。意見のぶつけ合いも証拠ベースになります。どのデータベースが良いかを議論で決める代わりに、2日かけて測定する。その結果はそのまま<a href="https://jared.lynskey.co.nz/ja/posts/2024/2024-12-03-decision-docs/" >意思決定文書</a>に流し込めます。</p>
<p>そして何より、安い保険です。ライブラリの限界を明らかにする2日間のスパイクは、開発が3スプリント進んでから同じ限界に気づくより、はるかに安上がりです。</p>

<h4 class="relative group">スパイクを使うべきとき、使うべきでないとき
    <div id="スパイクを使うべきとき使うべきでないとき" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%82%b9%e3%83%91%e3%82%a4%e3%82%af%e3%82%92%e4%bd%bf%e3%81%86%e3%81%b9%e3%81%8d%e3%81%a8%e3%81%8d%e4%bd%bf%e3%81%86%e3%81%b9%e3%81%8d%e3%81%a7%e3%81%aa%e3%81%84%e3%81%a8%e3%81%8d" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>スパイクの出番は、技術的な未知数のせいでチームが自信を持って見積もれないとき、有力な選択肢が複数あって選ぶためのデータが要るとき、新しい技術や連携を検討しているとき、パフォーマンスが不確実かつ重要なとき、そして何度ステークホルダーと話しても要件が曖昧なままのときです。</p>
<p>逆に、チームがすでにやり方を知っている作業や、手元の情報で決められる判断の先延ばしには使わないこと。また、まっとうな要件収集や<a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-08-27-user-acceptance-testing/" >ユーザー受け入れテスト</a>の代わりにもなりません。スパイクは問いに答えるものであって、プロダクトを検証するものではないからです。</p>

<h4 class="relative group">私の進め方
    <div id="私の進め方" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%a7%81%e3%81%ae%e9%80%b2%e3%82%81%e6%96%b9" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>まず問いを書き出します。「キャッシングを調査する」ではなく「Redisクラスターは50msのレイテンシ要件を満たせるか？」。対象と対象外をはっきりさせ、タイムボックスは1〜3日（それ以上必要なら問いが広すぎます）、達成をどう判定するかの成功基準も決めておきます。</p>
<p>あとは調べるだけです。ドキュメントや事例を読み、最小限の概念実証を作り、経験者に話を聞き、実際のコードで測る。スパイクのコードは最初から捨てる前提です。</p>
<p>タイムボックスが終わったら、調査結果、理由付きの推奨、見つかったリスクを書き上げ、プロトタイプには「スパイクの成果物であって本番コードではない」と明記してリンクします。チームに共有して質問を受け、学んだことに基づいてバックログを調整する。ストーリーを作る、磨く、消す、どれもありです。スパイクの進め方そのものを次の<a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-09-01-retrospecs/" >レトロスペクティブ</a>で振り返るのもおすすめです。スパイクは回数を重ねると目に見えて上手くなります。</p>

<h4 class="relative group">使っているテンプレート
    <div id="使っているテンプレート" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88" aria-label="アンカー">#</a>
    </span>
    
</h4>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## スパイク：[タイトル]
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**タイムボックス**</span>：[X日]
</span></span><span class="line"><span class="cl"><span class="gs">**オーナー**</span>：[名前]
</span></span><span class="line"><span class="cl"><span class="gs">**スプリント**</span>：[スプリント番号/名前]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 答えるべき質問
</span></span></span><span class="line"><span class="cl">[このスパイクが答える単一の焦点を当てた質問]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 背景
</span></span></span><span class="line"><span class="cl">[このスパイクが必要な理由；不確実性のきっかけ]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 仮定
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> [仮定1]
</span></span><span class="line"><span class="cl"><span class="k">-</span> [仮定2]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 範囲
</span></span></span><span class="line"><span class="cl">**対象範囲**：
</span></span><span class="line"><span class="cl"><span class="k">-</span> [項目1]
</span></span><span class="line"><span class="cl"><span class="k">-</span> [項目2]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**対象外**</span>：
</span></span><span class="line"><span class="cl"><span class="k">-</span> [項目1]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 成功基準
</span></span></span><span class="line"><span class="cl"><span class="k">- [ ]</span> [基準1]
</span></span><span class="line"><span class="cl"><span class="k">- [ ]</span> [基準2]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 調査結果
</span></span></span><span class="line"><span class="cl">[スパイク中に完了予定]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 推奨事項
</span></span></span><span class="line"><span class="cl">[スパイク後に完了予定]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### フォローアップストーリー
</span></span></span><span class="line"><span class="cl"><span class="k">- [ ]</span> [ストーリー1]
</span></span><span class="line"><span class="cl">- [ ] [ストーリー2]</span></span></code></pre></div></div>
<p>「仮定」の欄はちゃんと役に立ちます。「データモデルは基本的にリレーショナル」「読み取りは書き込みの10倍」と着手前に書いておくと、タイムボックスを使い切る前に前提そのものへ突っ込んでもらえますし、調査の途中で仮定が崩れたら、それは2日の無駄ではなく立派な発見になります。</p>

<h4 class="relative group">スパイクがこじれるパターン
    <div id="スパイクがこじれるパターン" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%82%b9%e3%83%91%e3%82%a4%e3%82%af%e3%81%8c%e3%81%93%e3%81%98%e3%82%8c%e3%82%8b%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>定番の失敗はスコープクリープです。気づけばスパイクが終わりのない研究プロジェクトになっている。新しい疑問が出てきたら（必ず出てきます）、今のスパイクを広げるのではなく、次のスパイク候補としてメモしておきます。2つ目の失敗は作り込みすぎ。スパイクのコードにエラーハンドリングやテストを足し始めた瞬間、探索から実装に足を踏み入れています。3つ目は記録を残さないこと。半年後に誰かが同じ問いにぶつかったとき、せっかくの2日分の学びが消えてしまいます。最後は、スパイクを既定の答えの追認として扱うこと。「このアプローチは無理」と判明したスパイクは、完璧に仕事をしています。</p>

<h4 class="relative group">スプリント計画への組み込み方
    <div id="スプリント計画への組み込み方" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%82%b9%e3%83%97%e3%83%aa%e3%83%b3%e3%83%88%e8%a8%88%e7%94%bb%e3%81%b8%e3%81%ae%e7%b5%84%e3%81%bf%e8%be%bc%e3%81%bf%e6%96%b9" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p><a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-10-08-planning-an-api/" >スプリントを計画する</a>ときに効いた習慣をいくつか。本当に未知数のあるストーリーは、今のスプリントでスパイクを回し、実作業は後のスプリントに置く。スパイクはスプリントあたり1〜2本まで。それ以上は集中力が霧散します。スパイクにストーリーポイントは付けません。生み出すのは知識であってソフトウェアではないので、タイムボックスで管理します。そしてスパイクの結果は、関連ストーリーの見積もりの後ではなく前、つまりリファインメントの場で共有します。</p>
<p>次に「答えより疑問のほうが多いストーリー」に出くわしたら、そのスプリントで一番価値ある作業はスパイクかもしれない、と考えてみてください。立ち止まって学ぶのが、結局いちばん速いこともあります。</p>

<h4 class="relative group">ざっくり言うと
    <div id="ざっくり言うと" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%81%96%e3%81%a3%e3%81%8f%e3%82%8a%e8%a8%80%e3%81%86%e3%81%a8" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p>スパイクは、見積もりだけでは答えの出ない問いひとつに絞って、1〜3日のタイムボックスで調べる作業です。使いどころは、未知数が見積もりを阻んでいるとき。有力な選択肢が複数あるのに選ぶためのデータがない、新しい技術や連携を検討している、パフォーマンスが不確実なうえに重要、何度話しても要件が曖昧なまま、といった場面です。逆に、チームがすでにやり方を知っている作業や、手元の情報で決められる判断の先延ばしには使いません。</p>
<p>成果物は動くソフトウェアではなく知識です。調査結果、理由付きの推奨、見つかったリスク、使い捨てのプロトタイプが残り、それをもとにバックログを調整します。スパイクにはストーリーポイントを付けずにタイムボックスで管理し、結果は関連ストーリーを見積もる前のリファインメントで共有します。</p>

<h4 class="relative group">さらに読む
    <div id="さらに読む" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%81%95%e3%82%89%e3%81%ab%e8%aa%ad%e3%82%80" aria-label="アンカー">#</a>
    </span>
    
</h4>
<p><strong>このサイトの関連記事：</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-09-01-retrospecs/" >レトロスペクティブ：スパイクの成果を振り返る</a> - スパイクの学びを継続的改善につなげる</li>
<li><a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-08-27-user-acceptance-testing/" >ユーザー受け入れテスト</a> - スパイクに基づく決定がユーザーニーズを満たすか検証する</li>
<li><a href="https://jared.lynskey.co.nz/ja/posts/2024/2024-12-03-decision-docs/" >意思決定文書</a> - スパイクの結果から生まれる決定を構造化する</li>
<li><a href="https://jared.lynskey.co.nz/ja/posts/2023/2023-10-08-planning-an-api/" >API計画</a> - スパイクがAPI設計の判断にどう効くか</li>
</ul>
<p><strong>外部リソース：</strong></p>
<ul>
<li><a href="https://scaledagileframework.com/spikes/"  target="_blank" rel="noreferrer">スパイク - Scaled Agile Framework (SAFe)</a> - 大規模開発でのスパイク運用ガイド</li>
<li><a href="http://www.extremeprogramming.org/rules/spike.html"  target="_blank" rel="noreferrer">スパイクソリューション - エクストリームプログラミング</a> - スパイクの発祥であるXPの原典</li>
<li><a href="https://scrumguides.org/"  target="_blank" rel="noreferrer">スクラムガイド</a> - スプリント計画におけるスパイクの位置づけ</li>
<li><a href="https://martinfowler.com/bliki/TechnicalDebt.html"  target="_blank" rel="noreferrer">Martin Fowlerの技術的負債について</a> - スパイクが技術的負債の予防にどう役立つか</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-10-18-spike/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>SSHログインをSlackに通知する：PAMとWebhookを使った設定方法</title>
      <link>https://jared.lynskey.co.nz/ja/posts/2021/2021-12-14-ssh-log/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/ja/posts/2021/2021-12-14-ssh-log/</guid>
      <pubDate>Tue, 14 Dec 2021 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Development</category>
      <category>Slack</category>
      <category>SSH</category>
      <category>Proactive</category>
      <category>DevOps</category>
      <description>SSHのログイン通知をSlackで受け取る方法です。PAMとSlackのIncoming Webhookを使い、誰かがサーバーにSSHでログインしようとしたら通知が届くようにします。ログイン成功時の通知もオプションで付けられます。</description>
      <content:encoded><![CDATA[
<h2 class="relative group">目的
    <div id="目的" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%9b%ae%e7%9a%84" aria-label="アンカー">#</a>
    </span>
    
</h2>
<ul>
<li>SSHでは、ログイン試行があったタイミングで任意のコマンドを実行できます。この記事では、Slackと連携させつつPAMの実行順序を制御する方法を紹介します。</li>
</ul>

<h2 class="relative group">Slack APIのWebhook
    <div id="slack-apiのwebhook" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#slack-api%e3%81%aewebhook" aria-label="アンカー">#</a>
    </span>
    
</h2>
<ul>
<li>
<p>アプリの作り方は<a href="https://api.slack.com/messaging/webhooks"  target="_blank" rel="noreferrer">こちら</a>にまとまっています。</p>
</li>
<li>
<p>Slackアプリを作成してWebhookを有効にし、SSHからの通知を受け取るためのIncoming Webhookを用意してください。</p>
</li>
</ul>

<h2 class="relative group">ログイン失敗時の通知スクリプト
    <div id="ログイン失敗時の通知スクリプト" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e5%a4%b1%e6%95%97%e6%99%82%e3%81%ae%e9%80%9a%e7%9f%a5%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88" aria-label="アンカー">#</a>
    </span>
    
</h2>
<ul>
<li>スクリプトはどこに置いても構いません。私は <code>/var/opt/notify-attempt.sh</code> に置きました。</li>
</ul>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">#!/bin/bash
</span></span><span class="line"><span class="cl">if [ &#34;$PAM_TYPE&#34; != &#34;close_session&#34; ]; then
</span></span><span class="line"><span class="cl">        url=&#34;&lt;YOUR SLACK WEBHOOK&gt;&#34;
</span></span><span class="line"><span class="cl">        channel=&#34;#channel&#34;
</span></span><span class="line"><span class="cl">        host=&#34;$(hostname)&#34;
</span></span><span class="line"><span class="cl">        content=&#34;\&#34;attachments\&#34;: [ { \&#34;mrkdwn_in\&#34;: [\&#34;text\&#34;, \&#34;fallback\&#34;], \&#34;fallback\&#34;: \&#34;SSH login: $PAM_USER connected to \`$host\`\&#34;, \&#34;text\&#34;: \&#34;SSH login to \`$host\`\&#34;, \&#34;fields\&#34;: [ { \&#34;title\&#34;: \&#34;User\&#34;, \&#34;value\&#34;: \&#34;$PAM_USER\&#34;, \&#34;short\&#34;: true }, { \&#34;title\&#34;: \&#34;IP Address\&#34;, \&#34;value\&#34;: \&#34;$PAM_RHOST\&#34;, \&#34;short\&#34;: true } ], \&#34;color\&#34;: \&#34;#F35A00\&#34; } ]&#34;
</span></span><span class="line"><span class="cl">        curl -X POST --data-urlencode &#34;payload={\&#34;channel\&#34;: \&#34;$channel\&#34;, \&#34;mrkdwn\&#34;: true, \&#34;username\&#34;: \&#34;SSH Notifications\&#34;, $content, \&#34;icon_emoji\&#34;: \&#34;:inbox-tray:\&#34;}&#34; &#34;$url&#34; &amp;
</span></span><span class="line"><span class="cl">fi
</span></span><span class="line"><span class="cl">exit</span></span></code></pre></div></div>

<h3 class="relative group">他のSSHイベントについて
    <div id="他のsshイベントについて" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%96%e3%81%aessh%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" aria-label="アンカー">#</a>
    </span>
    
</h3>
<ul>
<li>ログイン成功など、他のイベントも通知したい場合はファイルを2つ作るのがおすすめです。</li>
<li>それぞれのファイルに、Slackへ送るJSONを書いておきます。</li>
<li><code>fallback\&quot;: \&quot;SSH login: $PAM_USER connected to \</code>$host`&quot;` の行はイベントに合わせて書き換えてください。</li>
<li>OpenSSHがこれらのスクリプトをどう使うかは、下の設定を見れば分かります。</li>
</ul>

<h3 class="relative group">sshの設定
    <div id="sshの設定" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ssh%e3%81%ae%e8%a8%ad%e5%ae%9a" aria-label="アンカー">#</a>
    </span>
    
</h3>
<p>ログイン成功時の通知はコメントアウトしてあります。使いたい場合はコメントを外せば、成功時にもSlackへ通知が飛びます。
該当行：<code># auth  optional            pam_exec.so /var/opt/notify-login.sh</code></p>
<p>[success=2] は「ログインに成功したら2行スキップする」という意味で、これで失敗時の通知を飛ばしています。</p>
<p>ファイル：<code>/etc/pam.d/common-auth</code></p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"># /etc/pam.d/common-auth - authentication settings common to all services
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl"># This file is included from other service-specific PAM config files,
</span></span><span class="line"><span class="cl"># and should contain a list of the authentication modules that define
</span></span><span class="line"><span class="cl"># the central authentication scheme for use on the system
</span></span><span class="line"><span class="cl"># (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
</span></span><span class="line"><span class="cl"># traditional Unix authentication mechanisms.
</span></span><span class="line"><span class="cl">#
</span></span><span class="line"><span class="cl"># As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
</span></span><span class="line"><span class="cl"># To take advantage of this, it is recommended that you configure any
</span></span><span class="line"><span class="cl"># local modules either before or after the default block, and use
</span></span><span class="line"><span class="cl"># pam-auth-update to manage selection of other modules. See
</span></span><span class="line"><span class="cl"># pam-auth-update(8) for details.
</span></span><span class="line"><span class="cl"># here are the per-package modules (the &#34;Primary&#34; block)
</span></span><span class="line"><span class="cl">auth  [success=2 default=ignore]   pam_unix.so nullok
</span></span><span class="line"><span class="cl">auth  optional            pam_exec.so /var/opt/notify-attempt.sh
</span></span><span class="line"><span class="cl"># here&#39;s the fallback if no module succeeds
</span></span><span class="line"><span class="cl">auth  requisite            pam_deny.so
</span></span><span class="line"><span class="cl"># prime the stack with a positive return value if there isn&#39;t one already;
</span></span><span class="line"><span class="cl"># this avoids us returning an error just because nothing sets a success code
</span></span><span class="line"><span class="cl"># since the modules above will each just jump around
</span></span><span class="line"><span class="cl"># For successful login, uncomment the below line, ensure the file exists.
</span></span><span class="line"><span class="cl"># auth  optional            pam_exec.so /var/opt/notify-login.sh
</span></span><span class="line"><span class="cl"># auth  required            pam_permit.so
</span></span><span class="line"><span class="cl"># and here are more per-package modules (the &#34;Additional&#34; block)
</span></span><span class="line"><span class="cl">auth  optional            pam_cap.so
</span></span><span class="line"><span class="cl"># end of pam-auth-update config</span></span></code></pre></div></div>

<h2 class="relative group">ありがとうございました！
    <div id="ありがとうございました" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%81%82%e3%82%8a%e3%81%8c%e3%81%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%97%e3%81%9f" aria-label="アンカー">#</a>
    </span>
    
</h2>
<ul>
<li>質問やコメントがあれば、気軽に直接連絡してください</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2021/2021-12-14-ssh-log/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
