11月21日,比賽前一天
20日晚還在趕第二天編譯原理課的展示,21日上午才開始搞江蘇信安競賽初賽的運維。網站還沒有用戶和隊伍信息,信息要從一個csv文件中導入。也沒有題目信息,需要從一個.docx文件裏導入,我用的辦法是unoconv -f txt a.docx轉成文本文件a.txt後用awk處理得到csv格式的文件,之後在Rails項目的lib/tasks目錄裏創建了一個導入csv格式題目信息的task。在BCTF初賽平臺的基礎上,還有很多頁面、路由和模型等需要調整。
折騰到13:00多把nginx裝好運行起來了,14:30選手修改密碼截止。
上完編譯原理課,吃完晚飯就立刻動身去南京,在高鐵上繼續工作。
後臺的用戶管理頁面需要添加提交數字段,採用左外連接解決了這個問題。
1
2
3@users = User.order(:id).joins('left join submissions on submissions.user_id = users.id')
.select('users.*, count(submissions.id) as submissions_count')
.group('users.id').page params[:page]
23:00多下車,到達運維現場已是次日。之後完成了題目分類、場景描述等比較容易實現的需求,還要把題目的答案散列導入到網站使用的數據庫中。之後我們核對了各個題目的答案是否正確,準備離開運維現場已是3:30多。
11月22日,比賽第一天
比賽時間爲9:00到17:00。9:00不到到達運維現場。
當用戶產生一個新提交時,需要在submissions表裏添加一條記錄,並在users和teams表裏更新相關記錄的分數,我採用了這樣的邏輯:
1
2
3if correct_submission not exist
insert correct_submission
update scorecorrect_submissions被插入兩次,分數被增加兩次。爲此我一開始只用了單進程,開始着手用unique
index,即用team_id和correctness組成的鍵作爲索引,先嘗試插入提交記錄,如果成功再更新分數。考慮到錯誤請求很多又用不上,可以使用partial
index。到10:29問題解決,開始轉用多進程的unicorn作爲HTTP服務器。
13:00多網站一直在遭受CC攻擊,網站訪問很慢,重啓unicorn、重啓數據庫都不見效,服務器(虛擬機)內存只有4G,而內存使用量已經接近用滿,unicorn的工作進程一直因爲內存問題被SIGKILL,之後重啓了服務器,添加了內存。後來發現問題出在/scoreboard頁面,被這個頁面取消後就好了。之後重構了積分榜頁面的實現,取出所有正確提交計算各隊伍的分數,並確定解出的題目是哪些。
14:00發現之前積分榜的問題所在,緩存時間被人設置成兩秒了…… 14:50把積分榜的題目按照分類、分數、題目id排序。 15:44把題目顯示前3名改成顯示前16名。 16:17在後臺的提交管理頁面添加了表單,設置了幾個查詢條件用於篩選提交,方便工作人員審核。 17:00比賽結束,配置的at job生效,nginx原先的反向代理到rails網站的配置被替換成一個靜態頁面,顯示比賽暫停,次日繼續。 17:04根據要求修改了各題目分類的場景描述。
11月23日,比賽第二天
8:00多起牀,8:40多趕到運維現場,然後把nginx的靜態站點配置撤下換成rails網站。
9:00多把後臺的提交管理頁面改成根據通配符查詢了。
工作組考慮封禁作弊隊伍的特定題目,即扣掉得到的分數,並且不允許繼續提交該題,並在積分榜頁面標示出來。
我決定在積分榜頁面用紅點表示,並把Submission的correctness字段從boolean改成integer,允許一個新值-1表示該隊伍的此題被封禁,在積分榜頁面用紅色圓標示。之後開始學習rails和postgresql怎麼創建數據庫的migration變更字段類型,遇到一些問題,後來猜測是因爲partial
index對submissions表的依賴導致字段類型無法變更。添加了重建索引的邏輯的migration可用了,之後在後臺提交管理的表格裏添加了封禁按鈕,一支隊伍的某一道題被封禁後將扣除相應分數。
13:00多在/admins/submissions添加了根據表格特定列對提交進行排序的功能。
15:00多發現有隊伍重新提交了被封禁的題目得分了,原來在產生新的正確提交時只判斷了是否存在該隊伍同一道題的正確記錄,應該改成是否存在正確記錄或者被封禁記錄。
臨近結束網站開始受到了可能是開賽以來最大規模的CC攻擊,訪問變得很慢;此時我又得到新需求,要仔細核實前若干名隊伍的解題情況,因爲涉及到獲獎和晉級決賽的問題。還好之前BCTF初賽時導出分數爲tsv的task仍能使用,導出後用R畫了張圖。
17:00比賽結束,題目服務器停止服務。之後還有一些零碎的需求,比如關閉積分榜等,之後工作組成員還需要仔細核實可能晉級的隊伍的得分、提交等是否有異常。
離開南京,晚上到達北京南站已是23:20多。