<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ssh | Chia-An Lee</title><link>https://calee0219.github.io/tag/ssh/</link><atom:link href="https://calee0219.github.io/tag/ssh/index.xml" rel="self" type="application/rss+xml"/><description>Ssh</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><copyright>©</copyright><lastBuildDate>Mon, 09 Aug 2021 07:48:37 +0800</lastBuildDate><image><url>https://calee0219.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Ssh</title><link>https://calee0219.github.io/tag/ssh/</link></image><item><title>Linux 上密碼相關設定</title><link>https://calee0219.github.io/blog/note_linux_passwd/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_linux_passwd/</guid><description>&lt;h2 id="password-policy"&gt;Password Policy&lt;/h2&gt;
&lt;p&gt;密碼品質檢查，這個功能是透過 pam 時做，避免 user 弱密碼導致 ssh 或其他服務被破解 (&lt;code&gt;man pam_pwquality&lt;/code&gt;)&lt;/p&gt;
&lt;h3 id="修改方法"&gt;修改方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Debian 系統預設沒有 pwquality，需要先安裝: &lt;code&gt;sudo apt-get install libpam-pwquality&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以直接修改 &lt;code&gt;/etc/pam.d/&lt;/code&gt; 檔案，直接接在 &lt;code&gt;pam_unix.so&lt;/code&gt; 當行最後用空白隔開&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt; 檔案 [rpm_pam] 或用 &lt;code&gt;authconfig&lt;/code&gt; 指令 (Red Hat 系列，自己 man ㄅ)，可以寫在 &lt;code&gt;/etc/pam.d&lt;/code&gt;，不過都給 config file 了就用杯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定內容"&gt;設定內容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;密碼最小長度: &lt;code&gt;minlen=12 dcredit=0 ucredit=0 lcredit=0 ocredit=0 # 最少 12 char，後面 credit 要記得加，理由後述&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密碼複雜度:
&lt;ul&gt;
&lt;li&gt;其實前面的 &lt;code&gt;minlen&lt;/code&gt; 並不完全是密碼最小長度，而是密碼最少應得分數。計算方式是每個字元 +1，另外將字元分類成四類，分別再給一分，但另給的分數有上限:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ucredit=3&lt;/code&gt;: 密碼如果包含 upper-case 大寫字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lcredit=2&lt;/code&gt;: 密碼如果包含 lower-case 小寫字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dcredit=1&lt;/code&gt;: 密碼如果包含 digit-case 數字字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ocredit=0&lt;/code&gt;: 密碼如果包含 other-case 其他字母最多多給分數 (eg. 符號)&lt;/li&gt;
&lt;li&gt;分數加總後便是總所得分數，以上例來看，&lt;code&gt;$$$$$$$a&lt;/code&gt; 得分為 &lt;code&gt;8+0+1+0+0&lt;/code&gt;，符號沒額外得分，小寫單字額外一分。而 &lt;code&gt;$$$$$aaa&lt;/code&gt; 得分為 &lt;code&gt;8+0+2+0+0&lt;/code&gt;，小寫單字做多額外兩分，不會給超過。&lt;/li&gt;
&lt;li&gt;故得知，如果只寫 &lt;code&gt;minlen=12&lt;/code&gt;，會因為有額外分數而可以少於 12 字元&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;也可以不用得分來算複雜度，而是直接用管理員想要的數量，只要將所想要的數字加負號 (common)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ucredit=-1&lt;/code&gt;: upper-case 大寫字母最少 1 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lcredit=-2&lt;/code&gt;: lower-case 小寫字母最少 2 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dcredit=-3&lt;/code&gt;: digit-case 數字字母最少 3 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ocredit=-4&lt;/code&gt;: other-case 其他字母最少 4 個&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他參考 &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 最多可以是錯幾次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;difok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# 新密碼中不可出現跟舊密碼相同字串長度 (eg. 舊: abcdef，新密碼不可以是 abcdez)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;minclass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 最少一定要出現幾種字元 (大寫、小寫、數字、其他)，好處是不用限定一定要哪一種&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;maxrepeat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 最大可重複字元次數，0 是不檢查 (!) (eg. =3，則不能有 26aaaac)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;maxclassrepeat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 同一種類的字元最多可以重複出現的次數，0 是不檢查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;gecoscheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 會從 /etc/passwd 的 GECOS 欄位檢查是否有跟密碼重複超過 3 個字元串，簡單來說就是為了避免用身分資料來合成密碼，0 是不檢查，只有 True False (由 pam_cracklib 檢查)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;dictcheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 字典攻擊檢查，由 pam_cracklib 的字典來查找，選項 True False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;usercheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 檢查是否有 username 組成的密碼&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enforcing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 密碼規則建議或強制，預設 1 是強制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;badwords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gura inna &lt;span class="c1"&gt;# 自訂一不合法字串&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enforce_for_root &lt;span class="c1"&gt;# 如果使用者用 sudo passwd 也會強制檢查密碼，不然預設只會警告 (用 sudo 時)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;local_users_only &lt;span class="c1"&gt;# 只檢查有在 /etc/passwd 的密碼&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ucredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;lcredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;dcredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ocredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="password-expiration"&gt;Password Expiration&lt;/h2&gt;
&lt;p&gt;密碼過期，可以設定密碼有效期限，或是請使用者登入時修改密碼 (方便用於幫使用者亂數生成密碼給他後請他第一次登入修改密碼)&lt;/p&gt;
&lt;h3 id="logindefs"&gt;login.defs&lt;/h3&gt;
&lt;p&gt;這份檔案類似模板，只會影響到新加的使用者，對於已經存在的使用者並不影響&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_MAX_DAYS &lt;span class="m"&gt;1234&lt;/span&gt; &lt;span class="c1"&gt;# 密碼最多用幾天 (要換)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_MIN_DAYS &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 密碼幾天內不能修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_WARN_AGE &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="c1"&gt;# 密碼到期前幾天開始提醒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="chage"&gt;chage&lt;/h3&gt;
&lt;p&gt;修改現存使用者的密碼到期時間&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chage [options] LOGIN&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: 修改 &amp;ldquo;上一次修改時間&amp;rdquo;，可用 YYYY-MM-DD 格式或從 1970/01/01 開始算的天數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-E&lt;/code&gt;: 修改到期時間，可用 YYYY-MM-DD 格式或從 1970/01/01 開始算的天數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt;: help&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-I&lt;/code&gt;: 密碼到期後 N 天會直接把使用者鎖掉&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt;: list，顯示資料&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;: min，密碼幾天內不能修改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-M&lt;/code&gt;: max，密碼最多用幾天&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-R&lt;/code&gt;: 應用 chroot，也許是到期後把使用者 chroot 到低權限的家目錄 (?)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-W&lt;/code&gt;: 密碼到期前幾天開始提醒&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="迫使使用者換密碼"&gt;迫使使用者換密碼&lt;/h3&gt;
&lt;p&gt;通常一些系統我們可能為了避免知道使用者密碼，會亂數生成密碼給他，再請他登入後自己 &lt;code&gt;passwd&lt;/code&gt; 改密碼，但如何避免使用者懶得改呢?&lt;/p&gt;
&lt;p&gt;其實密碼到期後的下一次登入，系統並不會讓使用者無法登入，而是登入後迫使他改密碼，因此我們可以將使用者設定成密碼到期，便可以讓系統請他改密碼&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;passwd --expire $USER&lt;/code&gt;: 用 passwd 版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chage -d 0 $USER&lt;/code&gt;: 用 chage 版本，其實就是把他的到期日期設定成 1970/01/01&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remember"&gt;Remember&lt;/h2&gt;
&lt;p&gt;避免使用者設定以前設定過的密碼&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/pam.d&lt;/code&gt; 下的檔案 (&lt;code&gt;common-password&lt;/code&gt; 或 &lt;code&gt;system-auth&lt;/code&gt;)，password 最後面接 &lt;code&gt;remember=5&lt;/code&gt;，代表新密碼不能用前五次內的密碼&lt;/p&gt;
&lt;h2 id="password-generation"&gt;Password Generation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkpasswd&lt;/code&gt;: 用你輸入的參數送你密碼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;makepasswd --chars 12&lt;/code&gt;: 用 &lt;code&gt;urandom&lt;/code&gt; 送你一組密碼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwgen&lt;/code&gt;: 送你一堆密碼&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ps"&gt;P.S.&lt;/h2&gt;
&lt;p&gt;[rpm_pam]: 理論上要在 &lt;code&gt;/etc/pam.d/passwd&lt;/code&gt; 下面多寫 &lt;code&gt;password required pam_pwquality.so retry=3&lt;/code&gt; 讓系統知道要用 pam_pwquality，但現在預設應該都有 &lt;code&gt;auth include system-auth&lt;/code&gt;，而去翻 &lt;code&gt;system-auth&lt;/code&gt; 檔案會發現內部就有寫 &lt;code&gt;pam_pwquality&lt;/code&gt;，因此應該是不用特別再寫一次。&lt;/p&gt;
&lt;h2 id="reference"&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SSH 相關設定</title><link>https://calee0219.github.io/blog/note_ssh/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_ssh/</guid><description>&lt;p&gt;SSH 的全稱是 secure shell，大家都知道可以用來遠端進入機器的殼層，但有一些有趣的設定或應用也許不是廣為人知，仔細研究會發現 SSH 其實還蠻可怕的 XD&lt;/p&gt;
&lt;h2 id="client-side"&gt;Client Side&lt;/h2&gt;
&lt;h3 id="ssh-key"&gt;SSH key&lt;/h3&gt;
&lt;h3 id="ssh-with-hardware-key"&gt;SSH with hardware key&lt;/h3&gt;
&lt;h3 id="security-issue"&gt;Security issue&lt;/h3&gt;
&lt;h3 id="ssh-tunnel"&gt;SSH Tunnel&lt;/h3&gt;
&lt;h2 id="server-side"&gt;Server Side&lt;/h2&gt;
&lt;h2 id="password-policy"&gt;Password Policy&lt;/h2&gt;
&lt;p&gt;密碼品質檢查，這個功能其實不是掛在 ssh 下面的，只是因為 ssh 是 pam linux 的，所以可以順便避免 user 弱密碼導致 ssh 被破解 (&lt;code&gt;man pam_pwquality&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;參考
&lt;/p&gt;
&lt;h2 id="reference"&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>