nuage de tags sur la liste, suppression dropdown navbar, rôles/droits sur le profil

This commit is contained in:
Cedric Abonnel
2026-05-12 20:07:33 +02:00
parent 1d2e3d9a24
commit 6e438835f8
3470 changed files with 97124 additions and 109 deletions
@@ -0,0 +1,152 @@
<svg width="100%" viewBox="0 0 690 470" role="img" xmlns="http://www.w3.org/2000/svg" style="">
<title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Mises à jour automatiques de sécurité sur Debian</title>
<desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Illustration symbolique : un bouclier protégeant un terminal Debian, entouré de paquets de mise à jour en orbite et de flux de données sécurisés.</desc>
<defs>
<linearGradient id="bgGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0f1626"/>
<stop offset="1" stop-color="#1a2942"/>
</linearGradient>
<clipPath id="screenClip">
<rect x="240" y="200" width="200" height="120" rx="4"/>
</clipPath>
<mask id="imagine-text-gaps-g4glik" maskUnits="userSpaceOnUse"><rect x="0" y="0" width="690" height="470" fill="white"/><rect x="-14.833333015441895" y="-7.75" width="29.66666603088379" height="15.25" fill="black" rx="2"/><rect x="-14.833333015441895" y="-7.75" width="29.66666603088379" height="15.25" fill="black" rx="2"/><rect x="-22.95833396911621" y="-7.75" width="45.91666793823242" height="15.25" fill="black" rx="2"/><rect x="-17.541666984558105" y="-7.75" width="35.08333396911621" height="15.25" fill="black" rx="2"/><rect x="-12.125" y="-7.75" width="24.25" height="15.25" fill="black" rx="2"/><rect x="273.5666809082031" y="162.5" width="142.86666870117188" height="14" fill="black" rx="2"/><rect x="264" y="176.75" width="80.78333282470703" height="19" fill="black" rx="2"/><rect x="334" y="176.75" width="74.16666412353516" height="19" fill="black" rx="2"/><rect x="264" y="190.75" width="180.03334045410156" height="19" fill="black" rx="2"/><rect x="264" y="204.75" width="80.78333282470703" height="19" fill="black" rx="2"/><rect x="334" y="204.75" width="127.0999984741211" height="19" fill="black" rx="2"/><rect x="264" y="218.75" width="186.64999389648438" height="19" fill="black" rx="2"/><rect x="264" y="232.75" width="113.86666870117188" height="19" fill="black" rx="2"/><rect x="264" y="246.75" width="146.9499969482422" height="19" fill="black" rx="2"/><rect x="264" y="260.75" width="120.48332977294922" height="19" fill="black" rx="2"/><rect x="264" y="276.75" width="160.18333435058594" height="19" fill="black" rx="2"/><rect x="264" y="294.75" width="80.78333282470703" height="19" fill="black" rx="2"/><rect x="334" y="294.75" width="14.616666793823242" height="19" fill="black" rx="2"/><rect x="156.05833435058594" y="18" width="372.0666809082031" height="29" fill="black" rx="2"/><rect x="243.2083282470703" y="47.5" width="196.3333282470703" height="20.25" fill="black" rx="2"/><rect x="206.97500610351562" y="406.75" width="272.6666564941406" height="19" fill="black" rx="2"/><rect x="219.56666564941406" y="426.75" width="244.06666564941406" height="20.25" fill="black" rx="2"/></mask></defs>
<!-- Background -->
<rect x="0" y="0" width="680" height="460" style="stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Decorative grid -->
<g opacity="0.18" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.18;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<line x1="0" y1="100" x2="680" y2="100" stroke-width="0.5" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="200" x2="680" y2="200" stroke-width="0.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="300" x2="680" y2="300" stroke-width="0.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="400" x2="680" y2="400" stroke-width="0.5" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="170" y1="0" x2="170" y2="460" stroke-width="0.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="340" y1="0" x2="340" y2="460" stroke-width="0.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="510" y1="0" x2="510" y2="460" stroke-width="0.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:rgb(0, 0, 0);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Decorative stars / dots -->
<circle cx="80" cy="60" r="1.5" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="600" cy="80" r="2" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="120" cy="380" r="1.5" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="580" cy="400" r="1.5" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="50" cy="220" r="1" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="630" cy="250" r="1.5" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="640" cy="160" r="1" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="40" cy="320" r="1" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Orbital rings around the shield -->
<g fill="none" opacity="0.35" style="fill:none;stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.35;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<ellipse cx="340" cy="240" rx="260" ry="80" stroke="#3a5a8a" stroke-width="0.5" stroke-dasharray="2 4" style="fill:none;stroke:rgb(58, 90, 138);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:2px, 4px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<ellipse cx="340" cy="240" rx="220" ry="60" stroke="#4a7aaa" stroke-width="0.5" stroke-dasharray="3 3" style="fill:none;stroke:rgb(74, 122, 170);color:rgb(0, 0, 0);stroke-width:0.5px;stroke-dasharray:3px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Orbiting update packets -->
<g style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Packet left -->
<g transform="translate(85, 235)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-18" y="-12" width="36" height="24" rx="3" fill="#1e3a5f" stroke="#d70751" stroke-width="1" style="fill:rgb(30, 58, 95);stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="0" y="3" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#ffb8c8" style="fill:rgb(255, 184, 200);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:9px;font-weight:400;text-anchor:middle;dominant-baseline:auto">.deb</text>
</g>
<!-- Packet right -->
<g transform="translate(595, 245)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-18" y="-12" width="36" height="24" rx="3" fill="#1e3a5f" stroke="#d70751" stroke-width="1" style="fill:rgb(30, 58, 95);stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="0" y="3" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#ffb8c8" style="fill:rgb(255, 184, 200);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:9px;font-weight:400;text-anchor:middle;dominant-baseline:auto">.deb</text>
</g>
<!-- Packet top -->
<g transform="translate(340, 165)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-22" y="-12" width="44" height="24" rx="3" fill="#1e3a5f" stroke="#7fffaf" stroke-width="1" style="fill:rgb(30, 58, 95);stroke:rgb(127, 255, 175);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="0" y="3" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#7fffaf" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:9px;font-weight:400;text-anchor:middle;dominant-baseline:auto">CVE-fix</text>
</g>
<!-- Packet bottom-left -->
<g transform="translate(170, 310)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-20" y="-12" width="40" height="24" rx="3" fill="#1e3a5f" stroke="#ffd166" stroke-width="1" style="fill:rgb(30, 58, 95);stroke:rgb(255, 209, 102);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="0" y="3" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#ffd166" style="fill:rgb(255, 209, 102);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:9px;font-weight:400;text-anchor:middle;dominant-baseline:auto">patch</text>
</g>
<!-- Packet bottom-right -->
<g transform="translate(510, 305)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-18" y="-12" width="36" height="24" rx="3" fill="#1e3a5f" stroke="#7fffaf" stroke-width="1" style="fill:rgb(30, 58, 95);stroke:rgb(127, 255, 175);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="0" y="3" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#7fffaf" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:9px;font-weight:400;text-anchor:middle;dominant-baseline:auto">apt</text>
</g>
</g>
<!-- Arrows showing packets flowing toward the shield -->
<g stroke="#5a8aba" stroke-width="0.8" fill="none" opacity="0.6" stroke-dasharray="2 3" style="fill:none;stroke:rgb(90, 138, 186);color:rgb(0, 0, 0);stroke-width:0.8px;stroke-dasharray:2px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<path d="M 110 235 Q 200 230 240 235" style="fill:none;stroke:rgb(90, 138, 186);color:rgb(0, 0, 0);stroke-width:0.8px;stroke-dasharray:2px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 570 245 Q 480 240 440 240" style="fill:none;stroke:rgb(90, 138, 186);color:rgb(0, 0, 0);stroke-width:0.8px;stroke-dasharray:2px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 340 180 L 340 200" mask="url(#imagine-text-gaps-g4glik)" style="fill:none;stroke:rgb(90, 138, 186);color:rgb(0, 0, 0);stroke-width:0.8px;stroke-dasharray:2px, 3px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- The Shield -->
<g transform="translate(340, 240)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Shield outer glow ring -->
<path d="M 0 -130 L 95 -95 L 95 30 Q 95 95 0 130 Q -95 95 -95 30 L -95 -95 Z" fill="none" stroke="#d70751" stroke-width="2" opacity="0.4" style="fill:none;stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Shield body -->
<path d="M 0 -120 L 88 -88 L 88 28 Q 88 88 0 120 Q -88 88 -88 28 L -88 -88 Z" fill="#a30640" stroke="#d70751" stroke-width="1.5" style="fill:rgb(163, 6, 64);stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Inner shield panel (terminal screen) -->
<rect x="-78" y="-78" width="156" height="156" rx="4" fill="#0a1320" stroke="#2a3a5a" stroke-width="1" style="fill:rgb(10, 19, 32);stroke:rgb(42, 58, 90);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Terminal content inside shield -->
<g clip-path="url(#screenClip)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Terminal title bar -->
<rect x="262" y="162" width="156" height="14" fill="#1a2942" style="fill:rgb(26, 41, 66);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="270" cy="169" r="2.5" fill="#ff6b6b" style="fill:rgb(255, 107, 107);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="278" cy="169" r="2.5" fill="#ffd166" style="fill:rgb(255, 209, 102);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="286" cy="169" r="2.5" fill="#7fffaf" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="345" y="172" text-anchor="middle" font-family="ui-monospace, monospace" font-size="8" fill="#8a9ab8" style="fill:rgb(138, 154, 184);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:8px;font-weight:400;text-anchor:middle;dominant-baseline:auto">debian — unattended-upgrades</text>
<!-- Code lines -->
<text x="268" y="190" style="fill:rgb(255, 209, 102);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">root@srv:~#</text>
<text x="338" y="190" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">apt update</text>
<text x="268" y="204" style="fill:rgb(90, 138, 122);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto"># Reading package lists...</text>
<text x="268" y="218" style="fill:rgb(255, 209, 102);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">root@srv:~#</text>
<text x="338" y="218" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">unattended-upgrade</text>
<text x="268" y="232" style="fill:rgb(90, 138, 122);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto"># Checking security archive</text>
<text x="268" y="246" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">→ openssl 3.0.15</text>
<text x="268" y="260" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">→ linux-image 6.1.140</text>
<text x="268" y="274" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">→ libpam 1.5.2-6+</text>
<text x="268" y="290" style="fill:rgb(90, 138, 122);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto"># 3 packages upgraded ✓</text>
<text x="268" y="308" style="fill:rgb(255, 209, 102);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">root@srv:~#</text>
<text x="338" y="308" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:start;dominant-baseline:auto">_</text>
</g>
<!-- Lock icon at top of shield -->
<g transform="translate(340, 130)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="-12" y="-2" width="24" height="20" rx="3" fill="#ffd166" stroke="#a8861f" stroke-width="1" style="fill:rgb(255, 209, 102);stroke:rgb(168, 134, 31);color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M -8 -2 L -8 -10 Q -8 -18 0 -18 Q 8 -18 8 -10 L 8 -2" fill="none" stroke="#ffd166" stroke-width="2.5" mask="url(#imagine-text-gaps-g4glik)" style="fill:none;stroke:rgb(255, 209, 102);color:rgb(0, 0, 0);stroke-width:2.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="0" cy="7" r="2.5" fill="#1a2942" style="fill:rgb(26, 41, 66);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<rect x="-1" y="7" width="2" height="6" fill="#1a2942" style="fill:rgb(26, 41, 66);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Debian swirl emblem (stylized) -->
<g transform="translate(340, 358)" opacity="0.9" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<circle cx="0" cy="0" r="22" fill="none" stroke="#d70751" stroke-width="2" style="fill:none;stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M -8 -12 Q -16 -4 -12 6 Q -4 14 8 10 Q 14 4 12 -4" fill="none" stroke="#d70751" stroke-width="2.5" stroke-linecap="round" mask="url(#imagine-text-gaps-g4glik)" style="fill:none;stroke:rgb(215, 7, 81);color:rgb(0, 0, 0);stroke-width:2.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Title -->
<text x="340" y="40" text-anchor="middle" font-family="var(--font-sans), system-ui, sans-serif" font-size="20" font-weight="500" fill="#f5f7fa" style="fill:rgb(245, 247, 250);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Anthropic Sans, sans-serif, system-ui, sans-serif;font-size:20px;font-weight:500;text-anchor:middle;dominant-baseline:auto">
Mises à jour automatiques de sécurité
</text>
<text x="340" y="62" text-anchor="middle" font-family="var(--font-sans), system-ui, sans-serif" font-size="13" fill="#a8b8d0" style="fill:rgb(168, 184, 208);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Anthropic Sans, sans-serif, system-ui, sans-serif;font-size:13px;font-weight:400;text-anchor:middle;dominant-baseline:auto">
Debian · unattended-upgrades
</text>
<!-- Bottom tagline -->
<text x="340" y="420" text-anchor="middle" font-family="ui-monospace, monospace" font-size="11" fill="#7fffaf" opacity="0.85" style="fill:rgb(127, 255, 175);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:ui-monospace, monospace;font-size:11px;font-weight:400;text-anchor:middle;dominant-baseline:auto">
apt · security.debian.org · CVE patches
</text>
<text x="340" y="440" text-anchor="middle" font-family="var(--font-sans), system-ui, sans-serif" font-size="11" fill="#6b7a99" font-style="italic" style="fill:rgb(107, 122, 153);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Anthropic Sans, sans-serif, system-ui, sans-serif;font-size:11px;font-weight:400;font-style:italic;text-anchor:middle;dominant-baseline:auto">
Un serveur protégé pendant que vous dormez
</text>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

@@ -0,0 +1,86 @@
Dans un environnement de serveur ou de poste de travail, maintenir un système à jour avec les derniers correctifs de sécurité est crucial pour éviter toute vulnérabilité. Debian, l'une des distributions Linux les plus populaires et stables, propose des mécanismes permettant d'automatiser ce processus de mise à jour, et ainsi garantir que les correctifs de sécurité sont appliqués sans nécessiter une intervention manuelle.
Comment activer les mises à jour automatiques sur une machine Debian, en se concentrant spécifiquement sur les correctifs de sécurité ? Comment configurer ce processus pour un contrôle fin et comment tester que tout fonctionne correctement ?
### Étapes pour activer les mises à jour automatiques
#### 1. Installer les paquets nécessaires
La première étape pour activer les mises à jour automatiques sur Debian consiste à installer les outils nécessaires. Cela inclut le paquet `unattended-upgrades`, qui permet de gérer les mises à jour automatiques, ainsi que `apt-listchanges` qui permet de recevoir des informations sur les paquets mis à jour.
Exécutez la commande suivante pour installer ces paquets :
```bash
sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
```
#### 2. Configurer `unattended-upgrades`
Une fois le paquet installé, vous devez configurer `unattended-upgrades` pour qu'il applique automatiquement les mises à jour de sécurité. Cela se fait en modifiant certains fichiers de configuration dans `/etc/apt/apt.conf.d/`.
Exécutez la commande suivante pour reconfigurer `unattended-upgrades` :
```bash
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
Lors de la configuration, vous serez invité à activer les mises à jour automatiques. Assurez-vous que l'option **"Install security updates"** est sélectionnée. Cela garantit que les mises à jour de sécurité seront appliquées automatiquement sans intervention manuelle.
#### 3. Vérifier la configuration dans `/etc/apt/apt.conf.d/50unattended-upgrades`
Une fois la configuration initiale terminée, il est important de vérifier que le fichier de configuration principal de `unattended-upgrades` permet bien l'installation des mises à jour de sécurité.
Éditez le fichier `/etc/apt/apt.conf.d/50unattended-upgrades` avec votre éditeur de texte préféré, par exemple `nano` :
```bash
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
```
Dans ce fichier, vous devez vous assurer que la ligne suivante est présente et non commentée :
```plaintext
"${distro_id}:${distro_codename}-security";
```
Cela garantit que les mises à jour de sécurité de votre version de Debian seront appliquées automatiquement.
**Optionnel** : Si vous souhaitez également appliquer des mises à jour non critiques (par exemple des mises à jour mineures ou des corrections de bugs), vous pouvez activer les mises à jour pour tous les paquets en dé-commentant ou ajoutant cette ligne :
```plaintext
"${distro_id}:${distro_codename}-updates";
```
Cependant, cette option peut introduire des mises à jour qui ne sont pas toujours aussi urgentes que celles de sécurité. Il est donc recommandé de ne l'activer que si vous êtes à l'aise avec des mises à jour supplémentaires automatiques.
#### 4. Tester la configuration des mises à jour automatiques
Pour vous assurer que `unattended-upgrades` fonctionne comme prévu, il est utile de faire un test en mode "dry-run". Cela permet de simuler les mises à jour sans les appliquer réellement.
Exécutez la commande suivante :
```bash
sudo unattended-upgrades --dry-run --debug
```
Cette commande simule le processus de mise à jour et affiche des informations détaillées sur les paquets qui seraient mis à jour. Cela vous permet de vérifier que la configuration fonctionne correctement et que seules les mises à jour de sécurité (ou celles que vous avez spécifiées) seront prises en compte.
#### 5. Vérifier les logs
Une fois les mises à jour automatiques activées et en cours d'exécution, il est important de vérifier régulièrement les logs pour vous assurer qu'aucune mise à jour n'a échoué. Les logs de `unattended-upgrades` sont stockés dans le fichier `/var/log/unattended-upgrades/unattended-upgrades.log`.
Pour consulter les logs, utilisez la commande suivante :
```bash
sudo cat /var/log/unattended-upgrades/unattended-upgrades.log
```
Cela vous permet de suivre les mises à jour installées automatiquement et didentifier tout problème éventuel.
---
En activant les mises à jour automatiques sur votre machine Debian, vous vous assurez que les correctifs de sécurité sont appliqués rapidement et sans intervention manuelle, réduisant ainsi le risque de vulnérabilités exploitables.
N'oubliez pas que bien que l'activation des mises à jour automatiques pour les correctifs de sécurité soit essentielle, il est également important de tester régulièrement le processus, de vérifier les logs, et de maintenir une vigilance pour toute mise à jour système majeure qui pourrait nécessiter une attention spéciale.
En appliquant cette configuration, vous minimisez les risques liés à des failles de sécurité tout en maintenant la stabilité et la sécurité de votre environnement Debian.
@@ -0,0 +1,42 @@
{
"uuid": "976fd7f0-e53d-44e2-a879-58194765f3cf",
"slug": "activer-les-mises-a-jour-automatiques-sur-debian-pour-une-gestion-simplifiee-des-correctifs-de-securite",
"title": "Activer les mises à jour automatiques sur Debian pour une gestion simplifiée des correctifs de sécurité",
"author": "cedric@abonnel.fr",
"published": true,
"published_at": "2026-01-06 20:45",
"created_at": "2026-01-06 20:45:52",
"updated_at": "2026-05-12 09:33:15",
"revisions": [
{
"n": 1,
"date": "2026-05-12 00:18:42",
"comment": "",
"title": "Mises à jour automatiques de sécurité sur Debian"
},
{
"n": 2,
"date": "2026-05-12 00:22:53",
"comment": "",
"title": "Mises à jour automatiques de sécurité sur Debian"
},
{
"n": 3,
"date": "2026-05-12 09:33:15",
"comment": "",
"title": "Mises à jour automatiques de sécurité sur Debian"
}
],
"cover": "cover.svg",
"files_meta": {
"5cfac9bc6078c2d1-31391.svg": {
"author": "Cédrix",
"source_url": ""
}
},
"external_links": [],
"seo_title": "",
"seo_description": "",
"og_image": "",
"category": "linux"
}
@@ -0,0 +1,155 @@
Maintenir un système Debian à jour, c'est un peu comme fermer ses fenêtres avant de partir en vacances : on sait qu'il faut le faire, on sait pourquoi, et pourtant ça finit régulièrement par passer à la trappe. Le problème, c'est qu'une CVE qui traîne plusieurs semaines sur un serveur exposé, ça ne pardonne pas toujours.
Heureusement, Debian fournit tout ce qu'il faut pour automatiser l'application des correctifs de sécurité, à travers un paquet qui s'appelle `unattended-upgrades`. L'idée est simple : on configure une fois, et la machine se débrouille pour appliquer les patches `-security` sans qu'on ait à y penser. Ce qui suit, c'est la marche à suivre, avec les pièges que j'ai croisés en route.
## Le principe
`unattended-upgrades` n'est pas un démon qui tourne en permanence. C'est un script qui est lancé une fois par jour par un timer systemd (`apt-daily-upgrade.timer`), et qui regarde dans sa configuration quelles « origines » de paquets il a le droit de mettre à jour. Par défaut, il est conservateur : il ne touche qu'aux paquets venant du dépôt de sécurité officiel. C'est exactement ce qu'on veut sur un serveur de production.
Deux fichiers entrent en jeu :
- `/etc/apt/apt.conf.d/20auto-upgrades` décide *si* et *à quelle fréquence* unattended-upgrades est exécuté
- `/etc/apt/apt.conf.d/50unattended-upgrades` décide *quoi* mettre à jour et *comment*
On va passer par les deux.
## Installation
Rien de très exotique :
```bash
sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
```
`apt-listchanges` n'est pas strictement nécessaire, mais il est utile : il permet de recevoir un résumé des changements appliqués (notamment les entrées de `NEWS.Debian` qui annoncent parfois des changements de comportement qu'il vaut mieux ne pas découvrir un lundi matin).
## Activer l'exécution automatique
La commande classique pour ça :
```bash
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
L'interface te pose une question simple — « voulez-vous appliquer automatiquement les mises à jour de stabilité ? » — réponds oui. En coulisses, cette commande crée le fichier `/etc/apt/apt.conf.d/20auto-upgrades` avec ce contenu :
```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
```
Le `"1"` signifie « tous les jours ». Tu peux mettre `"7"` pour hebdomadaire, mais sur un serveur exposé je ne vois pas l'intérêt de retarder.
Pendant qu'on y est, deux options qu'on ajoute souvent à ce fichier :
```
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
```
La première télécharge les paquets en amont, ce qui rend l'installation plus rapide le moment venu. La seconde nettoie le cache `/var/cache/apt/archives` une fois par semaine, ce qui évite que ce dossier ne grossisse indéfiniment.
## Configurer le périmètre des mises à jour
C'est dans `/etc/apt/apt.conf.d/50unattended-upgrades` que ça se joue. Le fichier est livré commenté et documenté, ce qui aide. La section la plus importante ressemble à ça :
```
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename}-updates";
"origin=Debian,codename=${distro_codename},label=Debian";
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};
```
Sur une Debian récente (Bookworm et au-delà), ces lignes sont décommentées par défaut et couvrent les mises à jour de sécurité. Si tu veux être strictement sécurité-seulement, garde uniquement les deux lignes contenant `Debian-Security` et commente les autres. La règle est : `label=Debian-Security` correspond aux correctifs de l'équipe sécurité, le reste correspond aux mises à jour de point release (les `12.6 → 12.7` et compagnie).
Quelques options supplémentaires qui méritent qu'on s'y arrête :
### Le redémarrage automatique
```
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
```
Question politique autant que technique. Certaines mises à jour — typiquement le noyau ou la glibc — ne prennent effet qu'après reboot. Tant que la machine n'a pas redémarré, le correctif n'est pas réellement appliqué, même si le paquet est installé. Tu as deux options : laisser à `"false"` et reboot manuellement quand tu veux (en surveillant `/var/run/reboot-required`), ou passer à `"true"` avec une heure creuse. Sur un serveur isolé, le reboot auto se défend. Sur une base de données critique, beaucoup moins.
### Les notifications
```
Unattended-Upgrade::Mail "admin@exemple.fr";
Unattended-Upgrade::MailReport "on-change";
```
Très utile. Tu reçois un mail uniquement quand quelque chose a été installé (ou a échoué), ce qui évite le bruit. Évidemment, il faut un MTA configuré — `msmtp` ou un postfix en relais SMTP font le boulot.
### Le nettoyage
```
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
```
Sans ça, les vieux noyaux s'accumulent dans `/boot`, qui finit par se remplir, ce qui finit par bloquer la prochaine mise à jour du noyau. Classique.
## Tester avant de laisser tourner
Avant de partir en weekend, vérifie que la configuration est bien comprise :
```bash
sudo unattended-upgrades --dry-run --debug
```
Le dry-run ne touche à rien, mais il liste les paquets qui seraient installés et — surtout — il indique pourquoi un paquet est ou n'est pas retenu. Si tu vois `Checking: <paquet>` suivi de `Allowed origins are:` et que ton dépôt de sécurité apparaît bien dans la liste, c'est bon signe.
Tu peux aussi vérifier que les timers systemd sont actifs :
```bash
systemctl list-timers apt-daily.timer apt-daily-upgrade.timer
```
Ces deux timers sont fournis par le paquet `apt` lui-même, indépendamment de unattended-upgrades. Le premier rafraîchit la liste des paquets, le second déclenche l'upgrade. S'ils sont marqués `inactive`, c'est qu'ils sont masqués quelque part — un `systemctl unmask` règle généralement le problème.
## Vérifier après coup
Les logs vivent ici :
```bash
sudo less /var/log/unattended-upgrades/unattended-upgrades.log
sudo less /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
```
Le premier est un résumé lisible, le second contient la sortie brute de `dpkg`. Quand quelque chose se passe mal, c'est généralement dans le second qu'on trouve l'explication (un fichier de configuration modifié, un service qui refuse de redémarrer, ce genre de choses).
Pour savoir si la machine attend un reboot après une mise à jour de noyau :
```bash
ls /var/run/reboot-required 2>/dev/null && cat /var/run/reboot-required.pkgs
```
Si le fichier existe, c'est qu'au moins un paquet installé recommande un redémarrage. Le second fichier liste lesquels.
## Quelques pièges
**Les fichiers de configuration modifiés.** Si tu as personnalisé un `/etc/...` dont le paquet propose une nouvelle version, unattended-upgrades va voir un conflit et laisser tomber l'installation par défaut (option `--force-confdef`). C'est généralement le bon comportement, mais ça veut dire que certaines mises à jour resteront en attente jusqu'à une intervention manuelle. Les logs te le diront.
**Les paquets blacklistés.** Tu peux exclure des paquets précis de la mise à jour automatique :
```
Unattended-Upgrade::Package-Blacklist {
"libc6";
"linux-image-.*";
};
```
À utiliser avec discernement — exclure libc6 ou le noyau, c'est précisément exclure les correctifs qui comptent le plus. Mais sur une machine où un reboot coûte cher, ça permet de garder le contrôle sur les paquets sensibles tout en automatisant le reste.
**Les dépôts tiers.** Par défaut, seuls les dépôts Debian officiels sont concernés. Si tu utilises un PPA ou un dépôt comme celui de Docker ou de PostgreSQL, il faut explicitement l'ajouter dans `Origins-Pattern`. Sinon, ces paquets ne sont jamais mis à jour automatiquement — ce qui peut être un piège silencieux.
## Pour conclure
L'automatisation des mises à jour de sécurité sur Debian, ce n'est pas une boîte noire : c'est un script qui tourne une fois par jour, qui lit deux fichiers texte, et qui appelle `apt` avec des règles bien définies. Une fois qu'on a compris ça, le configurer revient à éditer ces deux fichiers selon ses contraintes — niveau de risque, fenêtre de reboot acceptable, notifications souhaitées.
Le minimum vital sur un serveur exposé tient en quatre points : `unattended-upgrades` installé, le périmètre limité aux dépôts `-security`, les notifications mail activées, et un coup d'œil régulier à `/var/run/reboot-required` pour ne pas oublier les redémarrages. Le reste, c'est de l'ajustement selon le contexte.
@@ -0,0 +1,155 @@
Maintenir un système Debian à jour, c'est un peu comme fermer ses fenêtres avant de partir en vacances : on sait qu'il faut le faire, on sait pourquoi, et pourtant ça finit régulièrement par passer à la trappe. Le problème, c'est qu'une CVE qui traîne plusieurs semaines sur un serveur exposé, ça ne pardonne pas toujours.
Heureusement, Debian fournit tout ce qu'il faut pour automatiser l'application des correctifs de sécurité, à travers un paquet qui s'appelle `unattended-upgrades`. L'idée est simple : on configure une fois, et la machine se débrouille pour appliquer les patches `-security` sans qu'on ait à y penser. Ce qui suit, c'est la marche à suivre, avec les pièges que j'ai croisés en route.
## Le principe
`unattended-upgrades` n'est pas un démon qui tourne en permanence. C'est un script qui est lancé une fois par jour par un timer systemd (`apt-daily-upgrade.timer`), et qui regarde dans sa configuration quelles « origines » de paquets il a le droit de mettre à jour. Par défaut, il est conservateur : il ne touche qu'aux paquets venant du dépôt de sécurité officiel. C'est exactement ce qu'on veut sur un serveur de production.
Deux fichiers entrent en jeu :
- `/etc/apt/apt.conf.d/20auto-upgrades` décide *si* et *à quelle fréquence* unattended-upgrades est exécuté
- `/etc/apt/apt.conf.d/50unattended-upgrades` décide *quoi* mettre à jour et *comment*
On va passer par les deux.
## Installation
Rien de très exotique :
```bash
sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
```
`apt-listchanges` n'est pas strictement nécessaire, mais il est utile : il permet de recevoir un résumé des changements appliqués (notamment les entrées de `NEWS.Debian` qui annoncent parfois des changements de comportement qu'il vaut mieux ne pas découvrir un lundi matin).
## Activer l'exécution automatique
La commande classique pour ça :
```bash
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
L'interface te pose une question simple — « voulez-vous appliquer automatiquement les mises à jour de stabilité ? » — réponds oui. En coulisses, cette commande crée le fichier `/etc/apt/apt.conf.d/20auto-upgrades` avec ce contenu :
```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
```
Le `"1"` signifie « tous les jours ». Tu peux mettre `"7"` pour hebdomadaire, mais sur un serveur exposé je ne vois pas l'intérêt de retarder.
Pendant qu'on y est, deux options qu'on ajoute souvent à ce fichier :
```
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
```
La première télécharge les paquets en amont, ce qui rend l'installation plus rapide le moment venu. La seconde nettoie le cache `/var/cache/apt/archives` une fois par semaine, ce qui évite que ce dossier ne grossisse indéfiniment.
## Configurer le périmètre des mises à jour
C'est dans `/etc/apt/apt.conf.d/50unattended-upgrades` que ça se joue. Le fichier est livré commenté et documenté, ce qui aide. La section la plus importante ressemble à ça :
```
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename}-updates";
"origin=Debian,codename=${distro_codename},label=Debian";
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};
```
Sur une Debian récente (Bookworm et au-delà), ces lignes sont décommentées par défaut et couvrent les mises à jour de sécurité. Si tu veux être strictement sécurité-seulement, garde uniquement les deux lignes contenant `Debian-Security` et commente les autres. La règle est : `label=Debian-Security` correspond aux correctifs de l'équipe sécurité, le reste correspond aux mises à jour de point release (les `12.6 → 12.7` et compagnie).
Quelques options supplémentaires qui méritent qu'on s'y arrête :
### Le redémarrage automatique
```
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
```
Question politique autant que technique. Certaines mises à jour — typiquement le noyau ou la glibc — ne prennent effet qu'après reboot. Tant que la machine n'a pas redémarré, le correctif n'est pas réellement appliqué, même si le paquet est installé. Tu as deux options : laisser à `"false"` et reboot manuellement quand tu veux (en surveillant `/var/run/reboot-required`), ou passer à `"true"` avec une heure creuse. Sur un serveur isolé, le reboot auto se défend. Sur une base de données critique, beaucoup moins.
### Les notifications
```
Unattended-Upgrade::Mail "admin@exemple.fr";
Unattended-Upgrade::MailReport "on-change";
```
Très utile. Tu reçois un mail uniquement quand quelque chose a été installé (ou a échoué), ce qui évite le bruit. Évidemment, il faut un MTA configuré — `msmtp` ou un postfix en relais SMTP font le boulot.
### Le nettoyage
```
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
```
Sans ça, les vieux noyaux s'accumulent dans `/boot`, qui finit par se remplir, ce qui finit par bloquer la prochaine mise à jour du noyau. Classique.
## Tester avant de laisser tourner
Avant de partir en weekend, vérifie que la configuration est bien comprise :
```bash
sudo unattended-upgrades --dry-run --debug
```
Le dry-run ne touche à rien, mais il liste les paquets qui seraient installés et — surtout — il indique pourquoi un paquet est ou n'est pas retenu. Si tu vois `Checking: <paquet>` suivi de `Allowed origins are:` et que ton dépôt de sécurité apparaît bien dans la liste, c'est bon signe.
Tu peux aussi vérifier que les timers systemd sont actifs :
```bash
systemctl list-timers apt-daily.timer apt-daily-upgrade.timer
```
Ces deux timers sont fournis par le paquet `apt` lui-même, indépendamment de unattended-upgrades. Le premier rafraîchit la liste des paquets, le second déclenche l'upgrade. S'ils sont marqués `inactive`, c'est qu'ils sont masqués quelque part — un `systemctl unmask` règle généralement le problème.
## Vérifier après coup
Les logs vivent ici :
```bash
sudo less /var/log/unattended-upgrades/unattended-upgrades.log
sudo less /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
```
Le premier est un résumé lisible, le second contient la sortie brute de `dpkg`. Quand quelque chose se passe mal, c'est généralement dans le second qu'on trouve l'explication (un fichier de configuration modifié, un service qui refuse de redémarrer, ce genre de choses).
Pour savoir si la machine attend un reboot après une mise à jour de noyau :
```bash
ls /var/run/reboot-required 2>/dev/null && cat /var/run/reboot-required.pkgs
```
Si le fichier existe, c'est qu'au moins un paquet installé recommande un redémarrage. Le second fichier liste lesquels.
## Quelques pièges
**Les fichiers de configuration modifiés.** Si tu as personnalisé un `/etc/...` dont le paquet propose une nouvelle version, unattended-upgrades va voir un conflit et laisser tomber l'installation par défaut (option `--force-confdef`). C'est généralement le bon comportement, mais ça veut dire que certaines mises à jour resteront en attente jusqu'à une intervention manuelle. Les logs te le diront.
**Les paquets blacklistés.** Tu peux exclure des paquets précis de la mise à jour automatique :
```
Unattended-Upgrade::Package-Blacklist {
"libc6";
"linux-image-.*";
};
```
À utiliser avec discernement — exclure libc6 ou le noyau, c'est précisément exclure les correctifs qui comptent le plus. Mais sur une machine où un reboot coûte cher, ça permet de garder le contrôle sur les paquets sensibles tout en automatisant le reste.
**Les dépôts tiers.** Par défaut, seuls les dépôts Debian officiels sont concernés. Si tu utilises un PPA ou un dépôt comme celui de Docker ou de PostgreSQL, il faut explicitement l'ajouter dans `Origins-Pattern`. Sinon, ces paquets ne sont jamais mis à jour automatiquement — ce qui peut être un piège silencieux.
## Pour conclure
L'automatisation des mises à jour de sécurité sur Debian, ce n'est pas une boîte noire : c'est un script qui tourne une fois par jour, qui lit deux fichiers texte, et qui appelle `apt` avec des règles bien définies. Une fois qu'on a compris ça, le configurer revient à éditer ces deux fichiers selon ses contraintes — niveau de risque, fenêtre de reboot acceptable, notifications souhaitées.
Le minimum vital sur un serveur exposé tient en quatre points : `unattended-upgrades` installé, le périmètre limité aux dépôts `-security`, les notifications mail activées, et un coup d'œil régulier à `/var/run/reboot-required` pour ne pas oublier les redémarrages. Le reste, c'est de l'ajustement selon le contexte.
@@ -0,0 +1,155 @@
Maintenir un système Debian à jour, c'est un peu comme fermer ses fenêtres avant de partir en vacances : on sait qu'il faut le faire, on sait pourquoi, et pourtant ça finit régulièrement par passer à la trappe. Le problème, c'est qu'une CVE qui traîne plusieurs semaines sur un serveur exposé, ça ne pardonne pas toujours.
Heureusement, Debian fournit tout ce qu'il faut pour automatiser l'application des correctifs de sécurité, à travers un paquet qui s'appelle `unattended-upgrades`. L'idée est simple : on configure une fois, et la machine se débrouille pour appliquer les patches `-security` sans qu'on ait à y penser. Ce qui suit, c'est la marche à suivre, avec les pièges que j'ai croisés en route.
## Le principe
`unattended-upgrades` n'est pas un démon qui tourne en permanence. C'est un script qui est lancé une fois par jour par un timer systemd (`apt-daily-upgrade.timer`), et qui regarde dans sa configuration quelles « origines » de paquets il a le droit de mettre à jour. Par défaut, il est conservateur : il ne touche qu'aux paquets venant du dépôt de sécurité officiel. C'est exactement ce qu'on veut sur un serveur de production.
Deux fichiers entrent en jeu :
- `/etc/apt/apt.conf.d/20auto-upgrades` décide *si* et *à quelle fréquence* unattended-upgrades est exécuté
- `/etc/apt/apt.conf.d/50unattended-upgrades` décide *quoi* mettre à jour et *comment*
On va passer par les deux.
## Installation
Rien de très exotique :
```bash
sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
```
`apt-listchanges` n'est pas strictement nécessaire, mais il est utile : il permet de recevoir un résumé des changements appliqués (notamment les entrées de `NEWS.Debian` qui annoncent parfois des changements de comportement qu'il vaut mieux ne pas découvrir un lundi matin).
## Activer l'exécution automatique
La commande classique pour ça :
```bash
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
L'interface te pose une question simple — « voulez-vous appliquer automatiquement les mises à jour de stabilité ? » — réponds oui. En coulisses, cette commande crée le fichier `/etc/apt/apt.conf.d/20auto-upgrades` avec ce contenu :
```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
```
Le `"1"` signifie « tous les jours ». Tu peux mettre `"7"` pour hebdomadaire, mais sur un serveur exposé je ne vois pas l'intérêt de retarder.
Pendant qu'on y est, deux options qu'on ajoute souvent à ce fichier :
```
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
```
La première télécharge les paquets en amont, ce qui rend l'installation plus rapide le moment venu. La seconde nettoie le cache `/var/cache/apt/archives` une fois par semaine, ce qui évite que ce dossier ne grossisse indéfiniment.
## Configurer le périmètre des mises à jour
C'est dans `/etc/apt/apt.conf.d/50unattended-upgrades` que ça se joue. Le fichier est livré commenté et documenté, ce qui aide. La section la plus importante ressemble à ça :
```
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename}-updates";
"origin=Debian,codename=${distro_codename},label=Debian";
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};
```
Sur une Debian récente (Bookworm et au-delà), ces lignes sont décommentées par défaut et couvrent les mises à jour de sécurité. Si tu veux être strictement sécurité-seulement, garde uniquement les deux lignes contenant `Debian-Security` et commente les autres. La règle est : `label=Debian-Security` correspond aux correctifs de l'équipe sécurité, le reste correspond aux mises à jour de point release (les `12.6 → 12.7` et compagnie).
Quelques options supplémentaires qui méritent qu'on s'y arrête :
### Le redémarrage automatique
```
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
```
Question politique autant que technique. Certaines mises à jour — typiquement le noyau ou la glibc — ne prennent effet qu'après reboot. Tant que la machine n'a pas redémarré, le correctif n'est pas réellement appliqué, même si le paquet est installé. Tu as deux options : laisser à `"false"` et reboot manuellement quand tu veux (en surveillant `/var/run/reboot-required`), ou passer à `"true"` avec une heure creuse. Sur un serveur isolé, le reboot auto se défend. Sur une base de données critique, beaucoup moins.
### Les notifications
```
Unattended-Upgrade::Mail "admin@exemple.fr";
Unattended-Upgrade::MailReport "on-change";
```
Très utile. Tu reçois un mail uniquement quand quelque chose a été installé (ou a échoué), ce qui évite le bruit. Évidemment, il faut un MTA configuré — `msmtp` ou un postfix en relais SMTP font le boulot.
### Le nettoyage
```
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
```
Sans ça, les vieux noyaux s'accumulent dans `/boot`, qui finit par se remplir, ce qui finit par bloquer la prochaine mise à jour du noyau. Classique.
## Tester avant de laisser tourner
Avant de partir en weekend, vérifie que la configuration est bien comprise :
```bash
sudo unattended-upgrades --dry-run --debug
```
Le dry-run ne touche à rien, mais il liste les paquets qui seraient installés et — surtout — il indique pourquoi un paquet est ou n'est pas retenu. Si tu vois `Checking: <paquet>` suivi de `Allowed origins are:` et que ton dépôt de sécurité apparaît bien dans la liste, c'est bon signe.
Tu peux aussi vérifier que les timers systemd sont actifs :
```bash
systemctl list-timers apt-daily.timer apt-daily-upgrade.timer
```
Ces deux timers sont fournis par le paquet `apt` lui-même, indépendamment de unattended-upgrades. Le premier rafraîchit la liste des paquets, le second déclenche l'upgrade. S'ils sont marqués `inactive`, c'est qu'ils sont masqués quelque part — un `systemctl unmask` règle généralement le problème.
## Vérifier après coup
Les logs vivent ici :
```bash
sudo less /var/log/unattended-upgrades/unattended-upgrades.log
sudo less /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
```
Le premier est un résumé lisible, le second contient la sortie brute de `dpkg`. Quand quelque chose se passe mal, c'est généralement dans le second qu'on trouve l'explication (un fichier de configuration modifié, un service qui refuse de redémarrer, ce genre de choses).
Pour savoir si la machine attend un reboot après une mise à jour de noyau :
```bash
ls /var/run/reboot-required 2>/dev/null && cat /var/run/reboot-required.pkgs
```
Si le fichier existe, c'est qu'au moins un paquet installé recommande un redémarrage. Le second fichier liste lesquels.
## Quelques pièges
**Les fichiers de configuration modifiés.** Si tu as personnalisé un `/etc/...` dont le paquet propose une nouvelle version, unattended-upgrades va voir un conflit et laisser tomber l'installation par défaut (option `--force-confdef`). C'est généralement le bon comportement, mais ça veut dire que certaines mises à jour resteront en attente jusqu'à une intervention manuelle. Les logs te le diront.
**Les paquets blacklistés.** Tu peux exclure des paquets précis de la mise à jour automatique :
```
Unattended-Upgrade::Package-Blacklist {
"libc6";
"linux-image-.*";
};
```
À utiliser avec discernement — exclure libc6 ou le noyau, c'est précisément exclure les correctifs qui comptent le plus. Mais sur une machine où un reboot coûte cher, ça permet de garder le contrôle sur les paquets sensibles tout en automatisant le reste.
**Les dépôts tiers.** Par défaut, seuls les dépôts Debian officiels sont concernés. Si tu utilises un PPA ou un dépôt comme celui de Docker ou de PostgreSQL, il faut explicitement l'ajouter dans `Origins-Pattern`. Sinon, ces paquets ne sont jamais mis à jour automatiquement — ce qui peut être un piège silencieux.
## Pour conclure
L'automatisation des mises à jour de sécurité sur Debian, ce n'est pas une boîte noire : c'est un script qui tourne une fois par jour, qui lit deux fichiers texte, et qui appelle `apt` avec des règles bien définies. Une fois qu'on a compris ça, le configurer revient à éditer ces deux fichiers selon ses contraintes — niveau de risque, fenêtre de reboot acceptable, notifications souhaitées.
Le minimum vital sur un serveur exposé tient en quatre points : `unattended-upgrades` installé, le périmètre limité aux dépôts `-security`, les notifications mail activées, et un coup d'œil régulier à `/var/run/reboot-required` pour ne pas oublier les redémarrages. Le reste, c'est de l'ajustement selon le contexte.