# 2021上系統管理-作業 ## HW1 ### 問題1:SSH連不上自己的server端 第二段ssh連綫評分,server端出現以下問題: * client端 ![judge logs](https://i.imgur.com/GkEaj5H.png) ![judge error](https://i.imgur.com/UQct7zm.png) 沒有任何錯誤訊息回報 * server端錯誤訊息 ![server error](https://i.imgur.com/oZW3maT.png) ### 問題2:突然ping不到主機 * 在學校上課想繼續完成作業一,但突然發現ping不到sa的server * **猜測1**:好像是不小心按到windows的PrtSc鍵,在Freebsd上開啓了tty,重開機后正常 ![cmd1](https://i.imgur.com/6tC189R.png) 試著重現,竟然還是ping得到,所以不是這個原因 ![cmd2](https://i.imgur.com/Sb6Dy3D.png) * **猜測2**:沒有機會嘗試,所以不知道(kini:可能是網路界面使用NAT模式時,沒有進行Port Forwarding) ### **今天10/1 submit:然後我就過了??????** ![submission](https://i.imgur.com/DV59xIQ.png) #### 回想之前作了什麽,才發現是.ssh/authorized_keys路徑名字錯誤:*原爲.ssh/authorrized_keys(多一個r),昨晚修正了這個錯誤* ![server error 2](https://i.imgur.com/w3DoHs8.png) 錯誤可重現,所以證據確鑿 #### 相關有用資訊與問題討論 > 引用鏈接: > https://groups.google.com/g/nctunasa/c/rJD-2WNkE5U > >**1. 使用 Wireguard 而不是 ssh 的原因** > > VPN 跟 SSH 本質上還是不同的,SSH 是讓管理員遠端操控某台機器,而 VPN 則是讓你的電腦和其他電腦可以構成一個虛擬的區域網路,舉個例子,如果你想跟同學玩 CS 1.6 的多人遊戲(希望我們還在同一個世代內QQ),但你們不在同一個區域網路內,用 SSH 是沒辦法做到的,需要用 VPN 才能做到。 > > 通常 VPN 會用在像是跨國公司的運作上,或是遠距工作,公司的某些網路服務會限制只能內網使用,透過 VPN 的機制讓不同的辦公室接入同一個內網。 > >**2. 設定檔與 Client、Server 的設定** > 因為以 VPN 的角色來說,是「你連入助教設定的區域網路」,當你連入助教的區域網路後,才會由 Online Judge 這邊發起 ssh / ftp 等等的連線到你的電腦 > 如果沒有 VPN 就直接做 SSH 連線也可以,但問題是 > 1. 大部分同學沒有固定 IP > 2. 讓 ssh 在網路上裸奔(沒有防火牆、沒有管理)有一定程度的危險,網路上有很多無聊的人會寫程式自動掃描所有的 IP 去看看有沒有誰忘記升級 ssh / mysql / ftp ... etc 然後做自動化的攻擊,如果你把 ssh 開在網路上(listen 0.0.0.0、public ip),可以去看看 Log,就會發現有一堆來暴力嘗試密碼的記錄 > 不過更精確來說 Wireguard 比較沒有所謂的 Client-Server 架構,它比較是 Peer to Peer 的 VPN 架構。 > >**3. 為什麼是 Online Judge 產生 private & public key** > 你的敘述正確,這邊延伸推薦可以去閱讀「非對稱加密」相關的文章,可以更瞭解 private key & public key 是什麼(可以解答你最後的問題)。 > > 至於為什麼這次是 Online Judge 產生 Private key 然後在請你們複製走,我個人的想法是(這題不是我出的XD),單純為了簡化流程,正常流程是,你產生 private key & public key 後要把 public key 提供給我們,我們在進機器去設定,但如果 150 位同學都這樣做,助教會忙死,當然也可以寫成系統自動填入,但每次在伺服器填入新的 public key 都會需要重開 wireguard server,會讓正在線上的同學斷線,為了方便,所以改成助教這邊幫每位同學產生不同的 private key。 #### ~~HW1結束, HW2地獄開始~~ ## HW2 ### HW2-1:one-liner script #### 問題一:我的log在哪裏~~~~~ * 剛打開要寫2-1就有點懵@@我所要用的audit_ip.txt,audit_sudo.txt和audit_user.txt在哪? * 查了群組,突然覺得自己好蠢= =, 以上三個txt檔是自己要產生的,而我要用的是auth.log![](https://i.imgur.com/v1SPMGF.png) * 答案:![](https://i.imgur.com/JSJrZY4.png) 來源:https://groups.google.com/u/2/g/nctunasa/c/WMgsyFnJXNc #### 編寫audit_\*.txt檔 1. 上課教了grep,sed,xargs,awk等等的内容,最終使用了功能最爲强大的awk來撰寫one-liner script 2. 找到的相關教材: 1. [GeekstoGeeks: AWK command in Unix/Linux with examples](https://www.geeksforgeeks.org/awk-command-unixlinux-examples/)(初步瞭解awk和内建variable) 2. [AWK Language Programming - A User's Guide for GNU AWK](https://www.math.utah.edu/docs/info/gawk_toc.html)(最有用,最齊全的内容) 3. 實際撰寫: 1. **audit_ip.txt:記錄所有ssh login failed的ip** 1. 分析/var/log/auth.log:![ip login failed 例子](https://i.imgur.com/gKAdAdp.png) 2. 主要鎖定keyword:*sshd,error*和*Authentication error* 2. **audit_sudo.txt**:記錄某個user使用sudo的指令 3. **audit_user.txt**: 4. 輸出:由於題目限制只能在script出現一次 > operand, 所以利用awk的for loop來撰寫 ### HW2-2: System Info Panel (10/22-10/29) 利用 [dialog](https://www.freebsd.org/cgi/man.cgi?query=dialog&sektion=1) 指令製作一個TUI(Text User Interface) > Use flow: <https://www.figma.com/file/ADvrfqOk6hDRhonqBXXHB0/HW2-2?node-id=0%3A1> * Entrance Page ![Entrance Page](https://i.imgur.com/QzwoBtk.png) * Post Announcement![Announcement/UserList](https://i.imgur.com/6giR8CL.png) * Post message ![Post message](https://i.imgur.com/CLzPM9k.png) * User List ![User list](https://i.imgur.com/Bvt3A9Y.png) * User Action ![User action](https://i.imgur.com/z1ZYXre.png) 1. Lock/Unlock it 1. Confirm message![Confirm message](https://i.imgur.com/AxuR8to.png) 2. succeeded message![succeed](https://i.imgur.com/KZPnaeH.png) 3. User action change to unlock it after action![unlock](https://i.imgur.com/iH3MXOx.png) 2. Group info![group info](https://i.imgur.com/KHKsyeb.png) 1. export path ![export](https://i.imgur.com/DW0BYLy.png) 3. Port info 1. all ports![port info](https://i.imgur.com/4lh1qqO.png) 2. specific port info![specific port](https://i.imgur.com/Ohz2L3U.png)按下OK回到all ports info 4. Login history![login](https://i.imgur.com/xSMTHUX.png) 5. Sudo log![sudo](https://i.imgur.com/m54R9nK.png) ## HW3:File Server & Backup ### HW3-1 FTP Server: * FTP over TLS: * reference:[Pure-FTPd: TLS Encryption](https://download.pureftpd.org/pub/pure-ftpd/doc/README.TLS) * Certificate Self-signing: * ```mkdir -p /etc/ssl/private``` * Generating DH parameter:```openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048``` Result:![generate DH parameter](https://i.imgur.com/0rA99y0.png) * generating RSA private key: ``` openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout \ /etc/ssl/private/pure-ftpd.pem \ -out /etc/ssl/private/pure-ftpd.pem ``` Result:![generating RSA private key](https://i.imgur.com/MJ3PHx0.png) * Change permission:```chmod 600 /etc/ssl/private/*.pem``` * The key and certificate:same as described in the documentation. ![Key](https://i.imgur.com/UjN3B0r.png) ![Certificate](https://i.imgur.com/Tqg1TPj.png) * Configuration:*/usr/local/etc/pure-ftpd.conf* ``` # This option accepts three values: # 0: disable SSL/TLS encryption layer (default). # 1: accept both cleartext and encrypted sessions. # 2: refuse connections that don't use the TLS security mechanism, # including anonymous sessions. # Do _not_ uncomment this blindly. Double check that: # 1) The server has been compiled with TLS support (--with-tls), # 2) A valid certificate is in place, # 3) Only compatible clients will log in. TLS 2 ``` * 該做了都作完了,但沒辦法連上綫:![TLS connection failed](https://i.imgur.com/E2rqlr6.png) * 最後發現configuration少做一項:要include 上面的Certificate才能使用TLS。 ![Pure-ftpd config:CertFile](https://i.imgur.com/EwQnfZY.png) * 還有TLS Cipher Suite. ``` # Cipher suite for TLS sessions. # The default suite is secure and setting this property is usually # only required to *lower* the security to cope with legacy clients. # Prefix with -C: in order to require valid client certificates. # If -C: is used, make sure that clients' public keys are present on # the server. TLSCipherSuite HIGH ``` * *sysadm* login: * 利用adduser增加一個sysadm:![adduser-sysadm](https://i.imgur.com/4p81jpT.png) * *ftp-vip1,ftp-vip2* login: * 利用pure-pw增加*ftp-vip1,ftp-vip2*兩個virtual users: * *anonymous* login: * anonymous本身是以ftp(user)的身份登進去,所以處理anonymous等同于處理ftp(user)的權限 * 但上傳後還是有問題: ![anonymous authorization2](https://i.imgur.com/tO9enEP.png) ![anonymous authorization2](https://i.imgur.com/2Y729Wl.png) * 問題出在pure-ftpd.conf的AntiWarez設爲yes,所以無法下載anonymous上傳的檔案->把AntiWarez設爲no ``` # Disallow downloads of files owned by the "ftp" system user; # files that were uploaded but not validated by a local admin. AntiWarez no ``` * [solving downloads unavailable problem](https://blog.51cto.com/sonice/1877019) * Log Rotate: [Pure-Ftpd documentation - FAQs:log files](https://download.pureftpd.org/pub/pure-ftpd/doc/FAQ) >\* Log files > >-> Where does logging info go ? How to redirect it to a specific file ? How >to suppress logging ? > >Log messages are sent to the syslog daemon. The syslog daemon is often >called syslogd or syslog-ng. He's in charge of dispatching logging events >from various programs to log files, according to a "facility" (category) >and a "priority" (urgency: debug, info, warning, error, critical...) . > >Pure-FTPd logging messages are send with the "ftp" facility by default (or >"local2" on some older systems without the "ftp" facility) . Unless you told >the syslogd to redirect messages with the "ftp" facility to a specific file, >the messages will be merged into /var/adm/messages, /var/log/messages, >/var/adm/syslog or /var/log/syslog. > >Check /etc/syslogd.conf. You should have a line like: > >`*.*;mail.none;news.none -/var/log/messages` > >just add `ftp.none`: > >`*.*;ftp.none;mail.none.news.none -/var/log/messages` > >And if you want FTP info go in a specific file, just add: > >`ftp.* /var/log/ftp` > >and all FTP messages will go in /var/log/ftp . And only there. > >The facility can be changed if you add the `-f <facility>` option to pure-ftpd >(or `--facility=<facility>`) . >To completely disable logging, use -f none (or --facility=none) . If you >don't read your log files, it's recommended: it will improve performance >and reduce disk I/O. ## 其他 ### windows virtualization問題 windows本身具有Hypervisor的feature,而當我啓用它時發現無論virtualbox或者VMware都無法使用。上網查詢似乎是因爲windows的為 **Type-1 (native) Hypervisor**, 而VirtualBox,VMware都是**Type-2 Hypervisor**,當啓動時只能使用預設的type1 hypervisor,而其餘的就無法使用 ![Hypervisor](https://i.imgur.com/5CHYYoO.png) 解決方案: * 利用**bcdedit**,把預設的boot entry hypervisorlaunchtype off掉,然後利用 bcdedit /copy複製原本的boot entry,再修改複製過的boot entry的hypervisorlaunchtype為auto(打開OS本身的Hypervisor) ![](https://i.imgur.com/kYJwOPj.png) * 但重啓後發現OS本身會直接幫我boot到default entry,要切換不同的boot entry還要手動打開設定重啓,還不如在cmd直接切換hypervisorlaunchtype * 最後發現是可以調整Windows Boot Manager的timeout,從0(也就是直接boot進default entry)變成1 * ![](https://i.imgur.com/IHDJg5P.png) * 調整成1 ![](https://i.imgur.com/1U483fU.png) **相關資料鏈接:https://www.tenforums.com/tutorials/139405-run-hyper-v-virtualbox-vmware-same-computer.html** **名詞解釋:** * **hypervisor**:也可稱爲Virtual Machine Monitor,允許host通過virtualization共享資源(memory、processing)來支持多個guest VM。 * **Boot and UEFI**: * ![](https://i.imgur.com/RQw2pGh.png) ### 想把freebsd變成fullscreen mode... 跑了下述指令安裝virtualbox-ose-additions…… ![](https://i.imgur.com/Ge5tws1.png) . . . . . . . . . . . . . . . . . . . . . . **結果……** . . . . . . . . . . . . . . . . . . . . . . . 不知道在下載什麽跑個不停……(我明明只是想改螢幕大小orz……) ![](https://i.imgur.com/kCShxlr.gif) * 最後發現需要的是vidcontrol指令,但我似乎沒得選…… * 圖:![](https://i.imgur.com/4oElD4N.png) ### 想透過putty以ssh的方式連綫 從HW1學得教訓 ~~(應該)~~ ,并且在HW2-1需要列出沒連綫成功的ip,所以想説想用port forwarding的方式連綫,同時也能解決上面改變不了解析度的問題,一舉多得,多好? * 問題一:port forwarding要如何設定? * 查資料:https://www.kjnotes.com/devtools/77 * Port Forwarding Rule:![](https://www.kjnotes.com/sites/default/files/contentimg/77/virtualboxnat044.png) > 『名稱』欄位可以填你日後能看得明白名稱;『協定』欄位,以SSH服務來說就選擇預設的『TCP』;『主機 IP』因為筆者想要從本機的主系統連上去,所以就填了『127.0.0.1』的IP位址;『主機連結埠』欄位就填寫你要使用到的Port號,以SSH服務來說,筆者會給他設『22』的Port號,當然假設你電腦的主系統的22 Port號已經被監聽(被其他服務使用著),那你可以改至其他的Port,比如說『2222』;『客體 IP』欄位就填寫剛剛在上面第一部分Step 2已經查好的作業系統IP位址,如:筆者剛剛查到的IP位址是『10.0.2.15』;『客體連接埠』以SSH服務來說,預設的Port號就是『22』。 * 先設定 host IP:127.0.0.1(loopback),port 22; guest IP 10.0.2.15, port為 **2222** (感覺是因爲從nasa測試主機要來連綫的話需要也listen這個port,想説改另一個會不會比較好) * 主機連綫:![](https://www.kjnotes.com/sites/default/files/contentimg/77/virtualboxnat062.png) * 但是被拒絕了 ![](https://i.imgur.com/2IZ8tOW.png) 可能是因爲該port沒有打開的原因 * 後來查到發現只要service sshd有在執行,port 22就會是打開的,於是把port 2222改成22 ![](https://i.imgur.com/qKnMWXU.png) * **成功!** ![](https://i.imgur.com/J7fPeGb.png) ### ssh與sshd的差異 基本上就是client端與server端設定的差別 server:**sshd** client: **ssh** ![](https://i.imgur.com/ThuJyBw.png)