Não, não há API, mas deve ser bem fácil criar uma usando o principal CVE ou lista de parceiros CVE em um banco de dados, em vez do site da USN ou arquivo de email:
Estou trabalhando em um sistema automatizado de auditoria de segurança que analisa instalações personalizadas do Ubuntu para verificar pacotes afetados por vulnerabilidades de segurança. Como essas máquinas não estão conectadas à Internet, não posso executar o apt-get
de forma simples, e precisamos manter as atualizações o mais pequenas possível, para que apenas atualizem os pacotes quando forem realmente necessários.
Parte deste processo é monitorar os avisos de segurança do Ubuntu (USN) para novos relatórios e extrair informações. No entanto, não consigo encontrar uma maneira de acessar facilmente todos os avisos históricos do USN.
Há um feed RSS vinculado no link , mas ele só retorna os 50 relatórios mais recentes, que não funcionam como Estou lidando com versões mais antigas do Ubuntu e preciso verificar relatórios históricos.
As duas opções que posso ver, nenhuma das quais boas, são para raspar os arquivos de e-mail ou raspar o site. Mas eu prefiro evitar fazer isso, se possível ...
Alguma idéia?
Não, não há API, mas deve ser bem fácil criar uma usando o principal CVE ou lista de parceiros CVE em um banco de dados, em vez do site da USN ou arquivo de email:
Aqui está um código do nó (testado com o nó 6.10.0) que vai raspar o conteúdo do link em uma planilha.
Veja como será a planilha:
Aquiestáamaneiradeexecutarocódigo:
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);
Aqui está o arquivo de suporte 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');
});
}
};
Tags security