Существует ли API для доступа к историческим уведомлениям о безопасности Ubuntu?

Я работаю над автоматизированной системой аудита безопасности, которая анализирует пользовательские установки Ubuntu для проверки пакетов, подверженных уязвимостям безопасности. Поскольку эти машины не подключены к Интернету, я не могу просто запустить apt-get, и мы должны сохранять как можно меньшие обновления, чтобы обновлять пакеты только тогда, когда они действительно нужны.

Частью этого процесса является мониторинг уведомлений о безопасности Ubuntu (USN) на наличие новых отчетов и извлечение информации. Тем не менее, я не могу найти способ легко получить доступ ко всем историческим уведомлениям USN.

Существует канал RSS, связанный с http://www.ubuntu.com/usn/ , но он возвращает только самые последние 50 отчетов, которые не будут работать, так как я имею дело со старшими Версии Ubuntu и нужно проверять исторические отчеты.

Два варианта, которые я вижу, ни один из которых не является хорошим, - это очистить архивы электронной почты или очистить веб-сайт. Но я бы предпочел избегать этого, если это возможно ...

Есть идеи?

6
задан 29 July 2012 в 16:05

2 ответа

Нет, API не существует, но его довольно легко создать, скопировав основной список CVE или партнера CVE в базу данных, вместо веб-сайта USN или архив электронной почты: enter image description here

0
ответ дан 29 July 2012 в 16:05

Вот некоторый код узла (протестированный с узлом 6.10.0), который очистит содержание https://usn.ubuntu.com/usn/в электронную таблицу.

Вот то, на что будет похожа электронная таблица:

CSV output as a spreadsheet

Вот способ выполнить код:

var config = {};
config.searchIssuesAfter = new Date('2016-08-28');
config.reportName = 'Ubuntu Report';
config.securityNoticeURL = 'https://usn.ubuntu.com/usn/precise/';
config.usnBaseURL = 'https://usn.ubuntu.com';
config.numberOfPages = 6;
ubuntuReport = require('./getUbuntuData.js'); 
ubuntuReport.go(config);

Вот вспомогательный файл getUbuntuData.js

var fs = require('fs');
var axios = require('axios');
var cheerio = require('cheerio');

module.exports = {
  go: function(config1) {
    //config
    var config = Object.assign({}, config1);
    var local = {};
    local.list = [];


    // Private functions  
    local.getPromiseUSNListFn = function(numPages){
      var promiseList = [];
      promiseList.push(axios.get(config.securityNoticeURL));
      for (var i = 2; i <= numPages; i++){
          promiseList.push(axios.get(config.securityNoticeURL+'?page='+i));
      }
      return promiseList;
    };

    local.sortByDateFn = function(a, b){
      return  b.timestamp - a.timestamp;
    };

    local.createSecurityNoticeListFn = function(response){
      var $ = cheerio.load(response.data);

      $('.notice').each( (i, elm) => {
        var securityNoticeNode = $(elm).find('h3 > a');
        var usn = securityNoticeNode.text().split(':')[0];
        var title = securityNoticeNode.text().split(': ')[1];
        var href = securityNoticeNode.attr("href");
        var dateNode = $(elm).find('h3');
        var dateStr = dateNode.contents().filter(function() {
          return this.nodeType == 3;
        }).text().trim();
        dateStr = dateStr.replace(/^\s*-\s*/,""); 
        var removeNewlinesRegEx = /(\r\n|\n|\r)/gm;
        dateStr = dateStr.replace(removeNewlinesRegEx,""); 
        dateStr = dateStr.replace(/(\d)(th|rd|nd|st)/,"$1");
        var date = new Date(dateStr);

        var infoObj = {
          usn: usn,
          title: title,
          href: config.usnBaseURL+href,
          timestamp: date.getTime(),
          date: dateStr
        };
        local.list.push(infoObj);
      });
    };

    local.getSecurityNoticeData = function(el){

        return axios.get(el.href).then( (response) => {
          el.summary = "";
          el.packages = [];
          el.versions = [];
          var $ = cheerio.load(response.data);
          console.log("Received : "+el.title);
          var removeNewlinesRegEx = /(\r\n|\n|\r)/gm;
          el.summary = $("h3:contains('Summary')").next().text().trim().replace(removeNewlinesRegEx," ");
          $("dl > dd").each((j, packageNode) => {
            el.packages.push($(packageNode).children().first().text().trim().replace(removeNewlinesRegEx," "));
            el.versions.push($(packageNode).children().first().next().text().trim().replace(removeNewlinesRegEx," "));
          });
        });
    };

    local.getPromiseListSecurityNoticesFn = function(){
      var promiseList = [];
      for (var i = 0; i < local.list.length; i++){
          promiseList.push(local.getSecurityNoticeData(local.list[i]));
      }
      return promiseList;
    };

    local.buildCSV = function(){
      var csv = "";
      csv += config.reportName+",,,,,,,,\n";
      csv += "Date,USN,Title,Package,Installed ?,Version,Urgency,Summary,Link\n";
      local.list.forEach((node) => {
        //node - final element
        var date = node.date;
        var usn = node.usn;
        var title = node.title;
        var packages = '"'+node.packages.join(", ")+'"';
        var installed = "?";
        var versions = '"'+node.versions.join(", ")+'"';
        var urgency = "?";
        var summary = '"'+node.summary+'"';
        var link = node.href;
        csv += date+",";
        csv += usn+",";
        csv += title+",";
        csv += packages+",";
        csv += installed+",";
        csv += versions+",";
        csv += urgency+",";
        csv += summary+",";
        csv += link;
        csv += "\n";
      });
      fs.writeFileSync(__dirname+"/../ubuntu_worksheet.csv", csv);
    };

    //Start 
    axios.all(local.getPromiseUSNListFn(config.numberOfPages))
      .then(axios.spread(function () {
        var i;
        for (i = 0; i < arguments.length; i++){
          console.log("Received page : "+i);
          local.createSecurityNoticeListFn(arguments[i]);
        }
        local.list.sort(local.sortByDateFn);
        for (i = 0; i < local.list.length; i++){
          if (local.list[i].timestamp < config.searchIssuesAfter.getTime()){
            //truncate list 
            local.list.length = i;
            break;
          }
        }
      }))
      .then(()=>{
        return axios.all(local.getPromiseListSecurityNoticesFn());
      }).then(()=>{
        local.buildCSV();
        console.log('data saved to ubuntu_worksheet.csv');
      });
   }
};
1
ответ дан 29 July 2012 в 16:05

Другие вопросы по тегам:

Похожие вопросы: