diff --git a/ISO27001effectiveness/NAMESPACE b/ISO27001effectiveness/NAMESPACE index ad59655..920b5e6 100644 --- a/ISO27001effectiveness/NAMESPACE +++ b/ISO27001effectiveness/NAMESPACE @@ -1,10 +1,23 @@ # Generated by roxygen2: do not edit by hand +export(GetAttackTypeEvolution) +export(GetAttackTypePie) +export(GetAttackTypeSigleEvolution) +export(GetAttacksEvolution) +export(GetAttacksMonthEvolution) +export(GetCertsEvolution) +export(GetContinentAttackCol) +export(GetContinentAttacksEvolution) +export(GetContinentAttacksSigleEvolution) +export(GetContinentCertsEvolution) +export(GetContinentCertsSingleEvolution) +export(GetContinentPie) +export(GetCountriesAttacksSingleEvolution) +export(GetCountriesCertsSingleEvolution) export(GetDefaultAttacksData) export(GetISOSurveyCertsPerCountry) export(GetISOSurveyCertsPerSector) export(GetISOSurveySitesPerCountry) -export(GetReportGraphs) export(ParseHMExcel) export(ParseHMFolder) export(ProccesISOSurveyByCountryRaw) diff --git a/ISO27001effectiveness/R/ReportGraphs.R b/ISO27001effectiveness/R/ReportGraphs.R index 785c12e..513867d 100644 --- a/ISO27001effectiveness/R/ReportGraphs.R +++ b/ISO27001effectiveness/R/ReportGraphs.R @@ -301,6 +301,17 @@ GetAttackTypeSigleEvolution <- function(Attacks, #-------------------------Geolocal evolution--------- #---------------------------------------------------------------- +#' Return pie graph to show % of attacks and certifications for each continent +#' +#' @param Attacks data.frame with procesed source data of attacks +#' @param Attacks.label.vjust Vector of vertical just to each portion label +#' @param Attacks.label.hjust Vector of horizontal just to each portion label +#' @param Cert_PerCountry data.frame with procesed source data of certifications +#' @param Certs.label.vjust Vector of vertical just to each portion label +#' @param Certs.label.hjust Vector of horizontal just to each portion label +#' +#' @return list(AttacksGraph, CertsGraph, ContinentListToStudy) +#' @export GetContinentPie <- function (Attacks, Attacks.label.vjust = 0, Attacks.label.hjust = 0, @@ -362,19 +373,33 @@ GetContinentPie <- function (Attacks, axis.title.y=element_blank()) + ggtitle("ISO 27001") - list(graph1, unique(attack.pie[attack.pie$perc > 5,]$Continent), - graph2, unique(cert.pie[cert.pie$perc > 5,]$Continent)) + #Return graphs and union of continent to study + list(graph1, graph2, + union(unique(attack.pie[attack.pie$perc > 5,]$Continent), + unique(cert.pie[cert.pie$perc > 5,]$Continent))) } -GetContinentAttacksEvolution <- function(Attacks){ - attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Continent, Year) +#' Return graph to show the evolution of a attack types list +#' +#' @param Attacks data.frame with procesed source data +#' @param ContinentList List with continents to show +#' +#' @return list(graph, data.frame with ContinentList attacks data by year) +#' @export +GetContinentAttacksEvolution <- function(Attacks, + ContinentList){ + + #Extract year from date + attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% + group_by(Continent, Year) #Grouping atacks by continent and year + #Counting attacks for each continent and year attacks.evol <- as.data.frame(table(attacks.evol$Continent, attacks.evol$Year)) colnames(attacks.evol) <- c("Continent", "Year","Attacks") + #Filtering by the ContinentList especified + attacks.evol <- attacks.evol[attacks.evol$Continent %in% ContinentList,] - attacks.evol <- attacks.evol[attacks.evol$Continent != "Oceania",] - attacks.evol <- attacks.evol[attacks.evol$Continent != "Africa",] - + #Graph graph1 <- ggplot2::qplot(main = "Cyberattacks evolution", x = attacks.evol$Year, y = attacks.evol$Attacks, @@ -384,26 +409,34 @@ GetContinentAttacksEvolution <- function(Attacks){ data = attacks.evol, geom = "point", color = Continent) + - geom_line() + - theme(plot.title = element_text(hjust = 0.5)) + geom_line() + + theme(plot.title = element_text(hjust = 0.5)) - graph1 + #Return graph and data to represent 1b1 + list(graph1, attacks.evol) } -GetContinentCertsEvolution <- function(Cert_PerCountry){ - - certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(Continent, Year) - - certs.evol <- summarise(certs.evol, - #Continent = Continent, - #Year = Year, - Certs = sum(Certs)) +#' Return graph to show the evolution of certifications in a continent list +#' +#' @param Cert_PerCountry data.frame with procesed source data +#' @param ContinentList List with continents to show +#' +#' @return list(graph, data.frame with ContinentList certifications data by year) +#' @export +GetContinentCertsEvolution <- function(Cert_PerCountry, + ContinentList){ + #Collapsing year columns to 1 column with year value + certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% + group_by(Continent, Year) #Grouping by continent and year + #Sum of certifications for echa continent and year + certs.evol <- summarise(certs.evol, Certs = sum(Certs)) + #Removing the X from year values certs.evol$Year <- substr(certs.evol$Year,2,5) + #Filtering for the specified continents + certs.evol <- certs.evol[certs.evol$Continent %in% ContinentList,] - certs.evol <- certs.evol[certs.evol$Continent != "Oceania",] - certs.evol <- certs.evol[certs.evol$Continent != "Africa",] - + #graph graph1 <- ggplot2::qplot(main = "ISO 27001 evolution", x = certs.evol$Year, y = certs.evol$Certs, @@ -413,268 +446,261 @@ GetContinentCertsEvolution <- function(Cert_PerCountry){ data = certs.evol, geom = "point", color = Continent) + - geom_line() + - theme(plot.title = element_text(hjust = 0.5)) + geom_line() + + theme(plot.title = element_text(hjust = 0.5)) - graph1 + #Return the graph and data to represent continents 1b1 + list(graph1, certs.evol) } +#' Return graph to show the evolution of attacks in a single continent and his smooth +#' +#' @param Attacks data.frame with procesed source data +#' @param Continent Continent to represent +#' @param smooth.x Horizontal position to smooth slope label +#' @param smooth.y Vertical position to smooth slope label +#' @param smooth.label.hjust Horizontal just to smooth slope label +#' +#' @return list(graph, slope) +#' @export +GetContinentAttacksSigleEvolution <- function(Attacks, + Continent, + smooth.x = 0, + smooth.y = 0, + smooth.label.hjust = 0){ -GetContinentAttacksTopEvolution <- function(Attacks){ - attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Continent) - attacks.evol <- as.data.frame(table(attacks.evol$Year, attacks.evol$Continent)) - attacks.evol <- setNames(attacks.evol, c("Year", "Continent", "Count")) - attacks.evol <- attacks.evol[attacks.evol$Continent != "",] - - attacks.evol <- spread(attacks.evol, "Continent", "Count") + #Filtering for the continent specified + attacks.evol <- Attacks[Attacks$Continent == Continent,] + #Calc slope + slope1 <- lm(formula = Attacks ~ as.numeric(Year), data = attacks.evol)$coef[[2]] + #Graph graph1 <- ggplot(data = attacks.evol, - aes(x = Year, y = Americas, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Americas") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph2 <- ggplot(data = attacks.evol, - aes(x = Year, y = Asia, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Asia") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph3 <- ggplot(data = attacks.evol, - aes(x = Year, y = Europe, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Europe") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - - list(graph1, graph2, graph3) + aes(x = Year, y = Attacks, group = 1)) + + geom_line() + + geom_point() + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle(Continent) + + xlab("Years") + ylab("Attacks")+ + geom_smooth(method = "lm", + se = FALSE) + + geom_label(aes(x = smooth.x, y = smooth.y, + label = paste("Slope =", signif(slope1, 5))), + color = "blue", + hjust = smooth.label.hjust) + #Returning list(graph, slope) + list(graph1, slope1) } +#' Return graph to show the evolution of certifications in a single continent and his smooth +#' +#' @param Certs_byContinent data.frame with procesed source data +#' @param Continent Continent to represent +#' @param smooth.x Horizontal position to smooth slope label +#' @param smooth.y Vertical position to smooth slope label +#' @param smooth.label.hjust Horizontal just to smooth slope label +#' +#' @return list(graph, slope) +#' @export +GetContinentCertsSingleEvolution <- function(Certs_byContinent, + Continent, + smooth.x = 0, + smooth.y = 0, + smooth.label.hjust = 0){ -GetContinentCertsTopEvolution <- function(Attacks){ - - certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(Continent, Year) - - certs.evol <- summarise(certs.evol, - #Continent = Continent, - #Year = Year, - Certs = sum(Certs)) - certs.evol$Year <- substr(certs.evol$Year,2,5) - - certs.evol <- spread(certs.evol, "Continent", "Certs") + #Filtering for the continent specified + certs.evol <- Certs_byContinent[Certs_byContinent$Continent == Continent,] + #Calc slope + slope1 <- lm(formula = Certs ~ as.numeric(Year), data = certs.evol)$coef[[2]] + #Graph graph1 <- ggplot(data = certs.evol, - aes(x = Year, y = Americas, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Americas") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph2 <- ggplot(data = certs.evol, - aes(x = Year, y = Asia, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Asia") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph3 <- ggplot(data = certs.evol, - aes(x = Year, y = Europe, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Europe") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - - list(graph1, graph2, graph3) + aes(x = Year, y = Certs, group = 1)) + + geom_line() + + geom_point() + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle(Continent) + + xlab("Years") + ylab("Certifications")+ + geom_smooth(method = "lm", + se = FALSE) + + geom_label(aes(x = smooth.x, y = smooth.y, + label = paste("Slope =", signif(slope1, 5))), + color = "blue", + hjust = smooth.label.hjust) + #Returning list(graph, slope) + list(graph1, slope1) } -GetCountriesCol <- function(Attacks, Cert_PerCountry){ - - certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(Continent, country_short) - - certs.evol <- summarise(certs.evol, - Certs = sum(Certs)) - - graph1 <- ggplot2::ggplot(aes(x = reorder(country_short, Certs), - y = Certs), - data = certs.evol[certs.evol$Certs > (sum(certs.evol$Certs) * 0.02),]) + - geom_col(aes(fill = Continent)) + - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("ISO 27001") + - xlab("Country") + ylab("Certifications") +#' Return graph to show the attacks by country +#' +#' @param Attacks data.frame with procesed source data of attacks +#' @param Attacks.label.vjust Vector of vertical just to each portion label +#' @param Attacks.label.hjust Vector of horizontal just to each portion label +#' @param Cert_PerCountry data.frame with procesed source certifications +#' @param Certs.label.vjust Vector of vertical just to each portion label +#' @param Certs.label.hjust Vector of horizontal just to each portion label +#' +#' @return list(AttacksGraph, CertsGraph, CountryListToStudy) +GetCountriesCol <- function(Attacks, + Attacks.label.vjust = 0, + Attacks.label.hjust = 0, + Cert_PerCountry, + Certs.label.vjust = 0, + Certs.label.hjust = 0){ + + #Group attacks by continent and country + attacks.col <- group_by(Attacks, Continent, Country) + #Count attacks for each country + attacks.col <- as.data.frame(table(attacks.col$Continent, attacks.col$Country)) + attacks.col <- setNames(attacks.col, c("Continent", "Country", "Count")) + #Remove rows without Continent/Country specified + attacks.col <- attacks.col[attacks.col$Country != "",] + attacks.col <- attacks.col[attacks.col$Country != "AU",] #Abnormal behaivour, corrupt?? + attacks.col <- attacks.col[attacks.col$Continent != "",] + #Only the countries with more than 2% of total attacks + attacks.col <- attacks.col[attacks.col$Count > (sum(attacks.col$Count) * 0.015), ] + #Sort by attacks + attacks.col <- arrange(attacks.col, desc(Count)) - attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Continent, Country) - attacks.evol <- as.data.frame(table(attacks.evol$Year, attacks.evol$Continent, attacks.evol$Country)) - attacks.evol <- setNames(attacks.evol, c("Year", "Continent", "Country", "Count")) - attacks.evol <- attacks.evol[attacks.evol$Continent != "",] - attacks.evol <- attacks.evol[attacks.evol$Country != "",] - attacks.evol <- attacks.evol[attacks.evol$Country != "AU",] + #Attacks graph + graph1 <- ggplot2::ggplot(aes(x = reorder(Country, Count), + y = Count), + data = attacks.col) + + geom_col(aes(fill = Continent)) + + geom_text(aes(label = attacks.col$Count), + vjust = Attacks.label.vjust, + hjust = Attacks.label.hjust, + size = 3) + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Attacks") + + xlab("Country") + ylab("Attacks") - attacks.evol <- attacks.evol[attacks.evol$Count > (sum((attacks.evol[attacks.evol$Country != "US",])$Count) * 0.01),] - attacks.evol <- arrange(attacks.evol, Count) + #Grouping certifications by continent + certs.col <- group_by(Cert_PerCountry, Continent, country_short) + #Counting certificates for each continent + certs.col <- dplyr::summarise(certs.col, Count = sum(X2011 + X2012 + X2013 + X2014 + X2015)) + #Remove rows without Continent specified + certs.col <- certs.col[certs.col$Continent != "",] + certs.col <- certs.col[certs.col$country_short != "",] + #Only the countries with more than 2% of total certs + certs.col <- certs.col[certs.col$Count > (sum(certs.col$Count) * 0.02), ] + #Sort by certifications + certs.col <- arrange(certs.col, desc(Count)) - graph2 <- ggplot2::ggplot(aes(x = reorder(Country, Count), + #Certifications graph + graph2 <- ggplot2::ggplot(aes(x = reorder(country_short, Count), y = Count), - data = attacks.evol) + - geom_col(aes(fill = Continent)) + - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("Attacks") + - xlab("Country") + ylab("Attacks") + data = certs.col) + + geom_col(aes(fill = Continent)) + + geom_text(aes(label = certs.col$Count), + vjust = Certs.label.vjust, + hjust = Certs.label.hjust, + size = 3) + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("ISO 27001") + + xlab("Country") + ylab("Certifications") - list(graph1, graph2) + #Return graphs and union of countries to study + list(graph1, graph2, + union(unique(head(attacks.col$Country, 3)), + unique(head(certs.col$country_short, 3)))) } -GetCountriesAttacksTopEvolution <- function(Attacks){ - attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Country) +#' Return graph to show the evolution of attacks in a single continent and his smooth +#' +#' @param Attacks data.frame with procesed source data +#' @param Country Country to represent +#' @param smooth.x Horizontal position to smooth slope label +#' @param smooth.y Vertical position to smooth slope label +#' @param smooth.label.hjust Horizontal just to smooth slope label +#' +#' @return list(graph, slope) +#' @export +GetCountriesAttacksSingleEvolution <- function(Attacks, + Country, + smooth.x = 0, + smooth.y = 0, + smooth.label.hjust = 0){ + #Extract year from date + attacks.evol <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% + group_by(Year, Country) #Group by country + #Count attacks for each year and country attacks.evol <- as.data.frame(table(attacks.evol$Year, attacks.evol$Country)) attacks.evol <- setNames(attacks.evol, c("Year", "Country", "Count")) - attacks.evol <- attacks.evol[attacks.evol$Country != "",] - - attacks.evol <- spread(attacks.evol, "Country", "Count") + #Filter by the specified country + attacks.evol <- attacks.evol[attacks.evol$Country == Country,] - slope1 <- lm(formula = US ~ as.numeric(Year), data = attacks.evol) + #Calc slope + slope1 <- lm(formula = Count ~ as.numeric(Year), data = attacks.evol)$coef[[2]] + #Graph graph1 <- ggplot(data = attacks.evol, - aes(x = Year, y = US, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("US") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + - geom_label(aes(x = "2014", y = 700, label = signif(slope1$coef[[2]])), color = "blue") - - graph2 <- ggplot(data = attacks.evol, - aes(x = Year, y = GB, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("GB") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph3 <- ggplot(data = attacks.evol, - aes(x = Year, y = IN, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("IN") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph4 <- ggplot(data = attacks.evol, - aes(x = Year, y = JP, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("JP") + - xlab("Years") + ylab("Attacks")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - + aes(x = Year, y = Count, group = 1)) + + geom_line() + + geom_point() + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle(Country) + + xlab("Years") + ylab("Attacks")+ + geom_smooth(method = "lm", + se = FALSE) + + geom_label(aes(x = smooth.x, y = smooth.y, + label = paste("Slope =", signif(slope1, 5))), + color = "blue", + hjust = smooth.label.hjust) - list(graph1, graph2, graph3, graph4) + #Return list(graph, slope) + list(graph1, slope1) } -GetCountriesCertsTopEvolution <- function(Attacks){ - - certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% group_by(country_short, Year) - - certs.evol <- rbind(certs.evol[certs.evol$country_short == "US",], - certs.evol[certs.evol$country_short == "GB",], - certs.evol[certs.evol$country_short == "IN",], - certs.evol[certs.evol$country_short == "JP",]) - +#' Return graph to show the evolution of certifications in a single continent and his smooth +#' +#' @param Attacks data.frame with procesed source data +#' @param Country Country to represent +#' @param smooth.x Horizontal position to smooth slope label +#' @param smooth.y Vertical position to smooth slope label +#' @param smooth.label.hjust Horizontal just to smooth slope label +#' +#' @return list(graph, slope) +#' @export +GetCountriesCertsSingleEvolution <- function(Cert_PerCountry, + Country, + smooth.x = 0, + smooth.y = 0, + smooth.label.hjust = 0){ + + #Collapsing year columns to only one with the year value + certs.evol <- gather(Cert_PerCountry, "Year", "Certs", 2:6) %>% + group_by(country_short, Year) #Group by country and year + #sum certificates for each country and year certs.evol <- summarise(certs.evol, Certs = sum(Certs)) + #Removing the X of the year values certs.evol$Year <- substr(certs.evol$Year,2,5) + #Filter by the specified Country + certs.evol <- certs.evol[certs.evol$country_short == Country,] - certs.evol <- spread(certs.evol, "country_short", "Certs") - + #Calc slope + slope1 <- lm(formula = Certs ~ as.numeric(Year), data = certs.evol)$coef[[2]] + #Graph graph1 <- ggplot(data = certs.evol, - aes(x = Year, y = US, group = 1)) + - + aes(x = Year, y = Certs, group = 1)) + geom_line() + geom_point() + - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("US") + + ggtitle(Country) + xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph2 <- ggplot(data = certs.evol, - aes(x = Year, y = GB, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("GB") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - graph3 <- ggplot(data = certs.evol, - aes(x = Year, y = IN, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("IN") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - - graph4 <- ggplot(data = certs.evol, - aes(x = Year, y = JP, group = 1)) + - - geom_line() + - geom_point() + - - theme(plot.title = element_text(hjust = 0.5)) + - ggtitle("JP") + - xlab("Years") + ylab("Certifications")+ - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) - - - list(graph1, graph2, graph3, graph4) + geom_smooth(method = "lm", + se = FALSE) + + geom_label(aes(x = smooth.x, y = smooth.y, + label = paste("Slope =", signif(slope1, 5))), + color = "blue", + hjust = smooth.label.hjust) + + #Return graph and slope + list(graph1, slope1) } @@ -683,300 +709,134 @@ GetCountriesCertsTopEvolution <- function(Attacks){ #-------------------------gelocal/type--------------------------- #---------------------------------------------------------------- -GetContinentAttackPie <- function (Attacks){ +#' Return graph representing % of attacks type by continent +#' +#' @param Attacks data.frame with procesed source data +#' @param Country Country to represent on the left side +#' @param Country2 Country to represent on the right side +#' +#' @return Graph +#' @export +GetContinentAttackCol <- function (Attacks, + Country, + Country2){ + #Grouping attacks by attack type and country attack.pie <- group_by(Attacks, Attack.standar, Country) + #Counting attacks for each attack type and country attack.pie <- as.data.frame(table(attack.pie$Country, attack.pie$Attack.standar)) attack.pie <- setNames(attack.pie, c("Country", "Attack", "Count")) - + #Remove rows withouth a country specified attack.pie <- attack.pie[attack.pie$Country != "",] + #Remove rows withouth attack type specified attack.pie <- attack.pie[attack.pie$Attack != "",] - + #grouping non 'important' attack types in 'Otros' attack.pie$Attack <- as.character(attack.pie$Attack) attack.pie[attack.pie$Attack != "DDoS" & attack.pie$Attack != "Defacement" & attack.pie$Attack != "Injection",]$Attack <- "Otros" attack.pie$Attack <- as.factor(attack.pie$Attack) - + #Grouping atatcks by attacky type and country attack.pie <- group_by(attack.pie, Attack, Country) + #sum attacks for each attack type and country attack.pie <- summarise(attack.pie, Count = sum(Count)) - attack.pie.US <- attack.pie[attack.pie$Country == "US",] - attack.pie.JP <- attack.pie[attack.pie$Country == "JP",] + #Filtering by the desired countries + attack.pie.C1 <- attack.pie[attack.pie$Country == Country,] + attack.pie.C2 <- attack.pie[attack.pie$Country == Country2,] + #Calc % of each attack type + attack.pie.C1$perc <- round(100 * attack.pie.C1$Count / sum(attack.pie.C1$Count), 2) + attack.pie.C2$perc <- round(100 * attack.pie.C2$Count / sum(attack.pie.C2$Count), 2) + + #Calc max % to draw gray background + attack.pie.max <- data.frame(Attack = attack.pie.C1$Attack) + percs <- c() + for (AT in attack.pie.max$Attack){ + percs <- c(percs, max(attack.pie.C1[attack.pie.C1$Attack == AT,]$perc, + attack.pie.C2[attack.pie.C2$Attack == AT,]$perc)) + } + attack.pie.max$perc <- percs + + graph1 <- ggplot() + + geom_col(aes(x=Attack, + y=perc), + width = 1, + data = attack.pie.max, + color = "Black", + fill = "Grey") + + geom_col(aes(x=1.25:4.25, + y=perc, + fill = Country), + width = 0.4, + data = attack.pie.C1) + + geom_text(aes(x=1.25:4.25, + y=perc + 1, + label = paste(perc, "%")), + data = attack.pie.C1) + + geom_col(aes(x=0.75:3.75, + y=perc, + fill = Country2), + width = 0.4, + data = attack.pie.C2) + + geom_text(aes(x=0.75:3.75, + y=perc + 1, + label = paste(perc, "%")), + data = attack.pie.C2) + + scale_x_discrete("Attack", attack.pie.C1$Attack) + + ylab("% of total attacks") + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle(paste(Country, Country2, sep = " - ")) - graph1 <- ggplot(data=attack.pie.US, - aes(x=factor(1), - y=Count, - fill=Attack)) + - geom_col(width = 1, color='black') + - geom_label(aes(label=paste(round(100 * attack.pie.US$Count / sum(attack.pie.US$Count), 2), "%")), - vjust=c(0), - hjust=c(0)) + - coord_polar(theta="y") + - scale_x_discrete(labels = c("")) + - scale_y_discrete(labels = c("")) + - theme(plot.title = element_text(hjust = 0.5), - axis.title.x=element_blank(), - axis.title.y=element_blank()) + - ggtitle("US") - - graph2 <- ggplot(data=attack.pie.JP, - aes(x=factor(1), - y=Count, - fill=Attack)) + - geom_col(width = 1, color='black') + - geom_label(aes(label=paste(round(100 * attack.pie.JP$Count / sum(attack.pie.JP$Count), 2), "%")), - vjust=c(0), - hjust=c(0)) + - coord_polar(theta="y") + - scale_x_discrete(labels = c("")) + - scale_y_discrete(labels = c("")) + - theme(plot.title = element_text(hjust = 0.5), - axis.title.x=element_blank(), - axis.title.y=element_blank()) + - ggtitle("JP") - - list(graph1, graph2) + graph1 } -GetContinentAttackEvolution <- function(Attacks){ +#' Return graph representing the evolution of attack types in a country +#' +#' @param Attacks data.frame with procesed source data +#' @param Country Country to represent +#' +#' @return list(Graph, data to represent attacktypes of the country 1b1) +GetContinentAttackEvolution <- function(Attacks, Country){ + + #Extract Year from date attack.evol <-mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% - group_by(Attack.standar, Country, Year) + group_by(Attack.standar, Country, Year) #Group by attack type, country and year + #Counting the attacks for each attack type, country and year attack.evol <- as.data.frame(table(attack.evol$Country, attack.evol$Attack.standar, attack.evol$Year)) attack.evol <- setNames(attack.evol, c("Country", "Attack", "Year", "Count")) - + #Removing rows without country or attack type attack.evol <- attack.evol[attack.evol$Country != "",] attack.evol <- attack.evol[attack.evol$Attack != "",] - + #grouping non 'important' attack types in 'Otros' attack.evol$Attack <- as.character(attack.evol$Attack) attack.evol[attack.evol$Attack != "DDoS" & attack.evol$Attack != "Defacement" & attack.evol$Attack != "Injection",]$Attack <- "Otros" attack.evol$Attack <- as.factor(attack.evol$Attack) - + #Counting attacks of new tyoe attack.evol <- group_by(attack.evol, Attack, Country, Year) attack.evol <- summarise(attack.evol, Count = sum(Count)) + #Filtering by specified country + attack.evol <- attack.evol[attack.evol$Country == Country,] - attack.evol.US <- attack.evol[attack.evol$Country == "US",] - attack.evol.JP <- attack.evol[attack.evol$Country == "JP",] - - attack.evol.US.Otros <- attack.evol.US[attack.evol.US$Attack == "Otros",] - attack.evol.JP.Otros <- attack.evol.JP[attack.evol.JP$Attack == "Otros",] - - - graph1 <- ggplot2::qplot(main = "US", - x = attack.evol.US$Year, - y = attack.evol.US$Count, - group = Attack, - xlab = "Years", - ylab = "Certifications", - data = attack.evol.US, - geom = "point", - color = Attack) + - geom_line() + - theme(plot.title = element_text(hjust = 0.5)) - - graph2 <- ggplot2::qplot(main = "JP", - x = attack.evol.JP$Year, - y = attack.evol.JP$Count, - group = Attack, + #Graph + graph1 <- ggplot2::qplot(main = Country, + x = attack.evol$Year, + y = attack.evol$Count, + group = attack.evol$Attack, xlab = "Years", - ylab = "Certifications", - data = attack.evol.JP, + ylab = "Attacks", + data = attack.evol, geom = "point", color = Attack) + geom_line() + theme(plot.title = element_text(hjust = 0.5)) - graph3 <- ggplot2::qplot(main = "US", - x = attack.evol.US.Otros$Year, - y = attack.evol.US.Otros$Count, - group = 1, - xlab = "Years", - ylab = "Certifications", - data = attack.evol.US.Otros, - geom = "point") + - geom_line() + - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + - theme(plot.title = element_text(hjust = 0.5)) - - graph4 <- ggplot2::qplot(main = "JP", - x = attack.evol.JP.Otros$Year, - y = attack.evol.JP.Otros$Count, - group = 1, - xlab = "Years", - ylab = "Certifications", - data = attack.evol.JP.Otros, - geom = "point") + - geom_line() + - stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + - theme(plot.title = element_text(hjust = 0.5)) - - list(graph1, graph2, graph3, graph4) + #list with graph and processed data to represent 1b1 + list(graph1, attack.evol) } -#---------------------------------------------------------------- -#---------------------------------------------------------------- -#---------------------------------------------------------------- - -GetBaseCertsGraph <- function(Cert_PerCountry, year){ - graph1 <- ggplot2::qplot(main = "Countries with above average number of companies certified with 27001 (2012)", - x = reorder(country_short,X2012), - y = X2012, - xlab = "Country", - ylab = "Number of certifications", - data = Cert_PerCountry[Cert_PerCountry$X2012 > mean(Cert_PerCountry$X2012),], - geom = "col", - fill = Continent) - graph1 -} - - - - -#' Return every graph used in the report file -#' -#' @param Cert_PerCountry data.frame with the processed data of ISO 27001 certifications -#' @param Attacks data.frame with the processed data of cyberattacks -#' -#' @return data.frame -#' @export -GetReportGraphs <- function(Cert_PerCountry,Attacks) { - #2012 - graph1 <- ggplot2::qplot(main = "Countries with above average number of companies certified with 27001 (2012)", - x = reorder(country_short,X2012), - y = X2012, - xlab = "Country", - ylab = "Number of certifications", - data = Cert_PerCountry[Cert_PerCountry$X2012 > mean(Cert_PerCountry$X2012),], - geom = "col", - fill = Continent) - - attacks2k12 <- Attacks[Attacks$Date < "2013-01-01" & Attacks$Date >= "2012-01-01",] - frameAttacks2k12 <- as.data.frame(table(attacks2k12$Country)) - colnames(frameAttacks2k12) <- c("Country","Attacks") - graph2 <- ggplot2::qplot(main = "Countries with above average number of cyberattacks (2012)", - x = reorder(Country,Attacks), - y = Attacks, - xlab = "Country", - ylab = "Number of attacks", - data = frameAttacks2k12[frameAttacks2k12$Attacks > mean(frameAttacks2k12$Attacks),], - geom = "col", - fill = Continent) - - Attacks2012ByMonth <- mutate(attacks2k12, month = format(attacks2k12$Date, "%m")) %>% group_by(month) - Attack2012FreqByMonth <- as.data.frame(table(Attacks2012ByMonth$month)) - colnames(Attack2012FreqByMonth) <- c("Month", "Attacks") - graph3 <- ggplot2::qplot(x = as.numeric(Month), - y = Attacks, - main = "Global cyberattack progression by month (2012)", - data = Attack2012FreqByMonth, - geom = c("point", "smooth"), - xlim = c(1,12), - xlab = "Month") + ggplot2::scale_x_continuous(breaks = 1:12) - - #2013 - graph4 <- ggplot2::qplot(main = "Countries with above average number of companies certified with 27001 (2013)", - x = reorder(country_short,X2013), - y = X2013, - xlab = "Country", - ylab = "Number of certifications", - data = Cert_PerCountry[Cert_PerCountry$X2013 > mean(Cert_PerCountry$X2013),] - , geom = "col", - fill = Continent) - attacks2k13 <- Attacks[Attacks$Date < "2014-01-01" & Attacks$Date >= "2013-01-01",] - frameAttacks2k13 <- as.data.frame(table(attacks2k13$Country)) - colnames(frameAttacks2k13) <- c("Country","Attacks") - graph5 <- ggplot2::qplot(main = "Countries with above average number of cyberattacks (2013)", - x = reorder(Country,Attacks), - y = Attacks, - xlab = "Country", - ylab = "Number of attacks", - data = frameAttacks2k13[frameAttacks2k13$Attacks > mean(frameAttacks2k13$Attacks),] - , geom = "col", - fill = Continent) - - Attacks2013ByMonth <- mutate(attacks2k13, month = format(attacks2k13$Date, "%m")) %>% group_by(month) - Attack2013FreqByMonth <- as.data.frame(table(Attacks2013ByMonth$month)) - colnames(Attack2013FreqByMonth) <- c("Month", "Attacks") - graph6 <- ggplot2::qplot(x = as.numeric(Month), - y = Attacks, - main = "Global cyberattack progression by month (2013)", - data = Attack2013FreqByMonth, - geom = c("point", "smooth"), - xlim = c(1,12), - xlab = "Month") + ggplot2::scale_x_continuous(breaks = 1:12) - - #2014 - graph7 <- ggplot2::qplot(main = "Countries with above average number of companies certified with 27001 (2014)", - x = reorder(country_short,X2014), - y = X2014, - xlab = "Country", - ylab = "Number of certifications", - data = Cert_PerCountry[Cert_PerCountry$X2014 > mean(Cert_PerCountry$X2014),] - , geom = "col", - fill = Continent) - attacks2k14 <- Attacks[Attacks$Date < "2015-01-01" & Attacks$Date >= "2014-01-01",] - frameAttacks2k14 <- as.data.frame(table(attacks2k14$Country)) - colnames(frameAttacks2k14) <- c("Country","Attacks") - graph8 <- ggplot2::qplot(main = "Countries with above average number of cyberattacks (2014)", - x = reorder(Country,Attacks), - y = Attacks, - xlab = "Country", - ylab = "Number of attacks", - data = frameAttacks2k14[frameAttacks2k14$Attacks > mean(frameAttacks2k14$Attacks),] - , geom = "col", - fill = Continent) - - Attacks2014ByMonth <- mutate(attacks2k14, month = format(attacks2k14$Date, "%m")) %>% group_by(month) - Attack2014FreqByMonth <- as.data.frame(table(Attacks2014ByMonth$month)) - colnames(Attack2014FreqByMonth) <- c("Month", "Attacks") - graph9 <- ggplot2::qplot(x = as.numeric(Month), - y = Attacks, - main = "Global cyberattack progression by month (2014)", - data = Attack2014FreqByMonth, - geom = c("point", "smooth"), - xlim = c(1,12), - xlab = "Month") + ggplot2::scale_x_continuous(breaks = 1:12) - - #2015 - graph10 <- ggplot2::qplot(main = "Countries with above average number of companies certified with 27001 (2015)", - x = reorder(country_short,X2015), - y = X2015, - xlab = "Country", - ylab = "Number of certifications", - data = Cert_PerCountry[Cert_PerCountry$X2015 > mean(Cert_PerCountry$X2015),] - , geom = "col", - fill = Continent) - attacks2k15 <- Attacks[Attacks$Date < "2016-01-01" & Attacks$Date >= "2015-01-01",] - frameAttacks2k15 <- as.data.frame(table(attacks2k15$Country)) - colnames(frameAttacks2k15) <- c("Country","Attacks") - graph11 <- ggplot2::qplot(main = "Countries with above average number of cyberattacks (2015)", - x = reorder(Country,Attacks), - y = Attacks, - xlab = "Country", - ylab = "Number of attacks", - data = frameAttacks2k15[frameAttacks2k15$Attacks > mean(frameAttacks2k15$Attacks),] - , geom = "col", - fill = Continent) - - Attacks2015ByMonth <- mutate(attacks2k15, month = format(attacks2k15$Date, "%m")) %>% group_by(month) - Attack2015FreqByMonth <- as.data.frame(table(Attacks2015ByMonth$month)) - colnames(Attack2015FreqByMonth) <- c("Month", "Attacks") - graph12 <- ggplot2::qplot(x = as.numeric(Month), - y = Attacks, - main = "Global cyberattack progression by month (2015)", - data = Attack2015FreqByMonth, - geom = c("point", "smooth"), - xlim = c(1,12), - xlab = "Month") + ggplot2::scale_x_continuous(breaks = 1:12) - - - - - list(graph1,graph2,graph3,graph4,graph5,graph6,graph7,graph8,graph9,graph10,graph11,graph12) -} diff --git a/ISO27001effectiveness/Report.Rmd b/ISO27001effectiveness/Report.Rmd index 115a6db..e39b417 100644 --- a/ISO27001effectiveness/Report.Rmd +++ b/ISO27001effectiveness/Report.Rmd @@ -1,5 +1,5 @@ --- -title: "Estudio sobre la efectividad de la certificación ISO 27001" +title: "Estudio sobre la efectividad de la certificación ISO 27001" output: html_document: default pdf_document: default @@ -199,193 +199,279 @@ Por otro lado tenemos _DNS_, cuya tendencia también tiene una pendiente negativ ### Evolución geográfica -Este apartado estudiará la relación entre la certificación ISO 27001 y los ataques producidos, pero teniendo en cuenta la variable geográfica, ya que es posible que la certificación, aunque sea internacional, se implemente de una mejor o peor forma según la región. En primer lugar se generalizará por continente. +Este apartado estudiará la relación entre la certificación ISO 27001 y los ataques producidos, pero teniendo en cuenta la variable geográfica, ya que es posible que la certificación, aunque sea internacional, se implemente o funcione de una mejor o peor forma según la región. En primer lugar se generalizará por continente. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} ContinentPies <- ISO27001effectiveness::GetContinentPie(Attacks, c(-2.5, 0, 2, 0, -2.5), c(1.4, 1, 0.5, 0.5, 0), Cert_PerCountry, -c(0, -1.5, -2.5, -2.5, -2.5), -c(0.5, 0.2, 0.5, 1.8, -0.5)) +c(-2.5, -2.5, 0, -1.5, -2.5), +c(-0.5, 1.9, 1, 0.25, 0.6)) -ContinentPies[[1]] +ContinentPies[[2]] ``` ```{r fig.width=4.5, fig.height=3} -ContinentPies[[3]] +ContinentPies[[1]] ``` -Se puede observar a simple vista que los continentes que reciben más ataques, por una cuestión lógica de superficie e intereses, son por orden América, Asia y Europa. En cambio los continentes que mas certificaciones ISO 27001 obtienen son por orden Asia, Europa y América. Tanto África como Oceania podemos descartarlos en este estudio ya que sus porcentajes no son relevantes. Observemos ahora cómo influye esto en el tiempo. +Se puede observar a simple vista que los continentes que reciben más ataques, por lo que podría ser una cuestión lógica de superficie y/o intereses, son por orden: América, Asia y Europa. En cambio, los continentes que mas certificaciones ISO 27001 obtienen son los mismos, pero en distinto orden: Asia, Europa y América. + +Tanto África como Oceania serán descartados en el resto del estudio ya que sus porcentajes no parecen relevantes. ```{r fig.width=4.5, fig.height=4,out.extra='style="float:left"'} -ISO27001effectiveness::GetContinentCertsEvolution(Cert_PerCountry) +ContinentCertEvolution <- ISO27001effectiveness::GetContinentCertsEvolution(Cert_PerCountry, ContinentPies[[3]]) + +ContinentCertEvolution[[1]] ``` ```{r fig.width=4.5, fig.height=4} -ISO27001effectiveness::GetContinentAttacksEvolution(Attacks) +ContinentAttacksEvolution <- ISO27001effectiveness::GetContinentAttacksEvolution(Attacks, ContinentPies[[3]]) + +ContinentAttacksEvolution[[1]] ``` -Se puede observar que la tendencia de las certificaciones es creciente mientras que la de los ataques es decreciente, pero procederemos a comparar cada una individualmente para poder demostrarlo numéricamente y no solo aparentemente. +Se puede observar que en conjunto la pendiente de la tendencia de las certificaciones es creciente, mientras que la de los ataques es decreciente. No obstante, se procederá a comparar cada continente individualmente para poder observarlo con más precisión. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topAttacks <- ISO27001effectiveness::GetContinentAttacksTopEvolution(Attacks) -topCerts <- ISO27001effectiveness::GetContinentCertsTopEvolution(Cert_PerCountry) -topCerts[[1]] -slope_Ame_Cert <- (fit[5] - fit[1]) / 4 +Ame_Cert <- GetContinentCertsSingleEvolution(ContinentCertEvolution[[2]], "Americas", "2013", 1400, 0.5) +Ame_Cert[[1]] +slope_Ame_Cert <- Ame_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[1]] -slope_Ame_Att <- (fit[5] - fit[1]) / 4 +Ame_Att <- GetContinentAttacksSigleEvolution(ContinentAttacksEvolution[[2]], "Americas", "2014", 850, 0) +Ame_Att[[1]] +slope_Ame_Att <- Ame_Att[[2]] ``` -La pendiente de los ataques para _América_ es `r slope_Ame_Att` mientras que la pendiente de las certificaciones es `r slope_Ame_Cert`. +Para _América_, la pendiente de la tendencia en las certificaciones es `r slope_Ame_Cert`, mientras que la pendiente de los ataques es `r slope_Ame_Att`. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topCerts[[2]] -slope_Asi_Cert <- (fit[5] - fit[1]) / 4 +Asi_Cert <- GetContinentCertsSingleEvolution(ContinentCertEvolution[[2]], "Asia", "2013", 13500, 0.5) +Asi_Cert[[1]] +slope_Asi_Cert <- Asi_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[2]] -slope_Asi_Att <- (fit[5] - fit[1]) / 4 +Asi_Att <- GetContinentAttacksSigleEvolution(ContinentAttacksEvolution[[2]], "Asia", "2014", 400, 0) +Asi_Att[[1]] +slope_Asi_Att <- Asi_Att[[2]] ``` -La pendiente de los ataques para _Asia_ es `r slope_Asi_Att` mientras que la pendiente de las certificaciones es `r slope_Asi_Cert`. +Para _Asia_, la pendiente de la tendencia en las certificaciones es `r slope_Asi_Cert`, mientras que la pendiente de los ataques es `r slope_Asi_Att`. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topCerts[[3]] -slope_Eu_Cert <- (fit[5] - fit[1]) / 4 +Eu_Cert <- GetContinentCertsSingleEvolution(ContinentCertEvolution[[2]], "Europe", "2013", 9500, 0.5) +Eu_Cert[[1]] +slope_Eu_Cert <- Eu_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[3]] -slope_Eu_Att <- (fit[5] - fit[1]) / 4 +Eu_Att <- GetContinentAttacksSigleEvolution(ContinentAttacksEvolution[[2]], "Europe", "2014", 375, 0) +Eu_Att[[1]] +slope_Eu_Att <- Eu_Att[[2]] ``` -La pendiente de los ataques para _Europa_ es `r slope_Eu_Att` mientras que la pendiente de las certificaciones es `r slope_Eu_Cert`. - -Todas las pendientes podrían representar la relación que buscamos, en la que un aumento en las certificaciones produce un descenso en los ataques. +Para _Europa_, la pendiente de la tendencia en las certificaciones es `r slope_Eu_Cert`, mientras que la pendiente de los ataques es `r slope_Eu_Att`. -El análisis puede aumentar en profundidad estableciendo superficies geográficas más pequeñas y asi obtener más precisión, observemos lo que ocurre a nivel de paises. Se mostrarán a continuación los paises que superan aproximadamente un 2% de los ataques/certificaciones totales ya que la lista total de paises es demasiado extensa. +El análisis continuará estableciendo superficies geográficas más pequeñas, aumentando así la precisión, para poder observar lo que ocurre a nivel de paises. Se mostrarán a continuación los que superan aproximádamente un 2% de las certificaciones totales y el 1,5% para los ataques (porque _Estados Unidos_ recibe la gran mayoría y si no saldría solo), ya que la lista completa es demasiado extensa. Los nombres serán representados con los dos caracteres correspondientes al estándar ISO. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -top <- GetCountriesCol(Attacks, Cert_PerCountry) -top[[1]] +CountryCol <- GetCountriesCol(Attacks,0, 0.5, + Cert_PerCountry, 0, 0.5) +CountryCol[[2]] ``` ```{r fig.width=4.5, fig.height=3} -top[[2]] +CountryCol[[1]] ``` -Como se puede observar en la parte de certificaciones destaca de largo Japón sobre los demás, que se encuentra bastante bajo en la lista de ataques. Y al reves pasa algo parecido, en los ataques destaca Estados Unidos por mucho mientras que ese mismo pais está muy bajo en certificaciones. A continuación observaremos la evolución temporal del top 3 paises en ataques recibidos y en certificaciones obtenidas, varios de ellos coinciden, tenemos por la parte de las certificaciones a _Japón_, por la parte de los ataques a _Estados Unidos_, y común a ambas _Reino Unido_ e _India_. +Como se puede observar, en la parte de certificaciones destaca de largo _Japón_ sobre los demás, que a su vez se encuentra bastante bajo en la lista de ataques. Y, de un modo totalmente contrario, en los ataques destaca _Estados Unidos_ por mucho, mientras que este mismo está muy bajo en certificaciones. + +El estudio continuará en profundidad con el top 3 de paises en número de certificaciones y en número de ataques recibidos, aunque algunos de ellos coincidan. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topAttacks <- ISO27001effectiveness::GetCountriesAttacksTopEvolution(Attacks) -topCerts <- ISO27001effectiveness::GetCountriesCertsTopEvolution(Cert_PerCountry) -topCerts[[1]] -slope_US_Cert <- (fit[5] - fit[1]) / 4 +US_Cert <- GetCountriesCertsSingleEvolution(Cert_PerCountry, + CountryCol[[3]][1], + "2013", 875, 0.5) + +US_Cert[[1]] +slope_US_Cert <- US_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[1]] -slope_US_Att <- (fit[5] - fit[1]) / 4 +US_Att <- GetCountriesAttacksSingleEvolution(Attacks, + CountryCol[[3]][1], + "2014", 725, 0) + +US_Att[[1]] +slope_US_Att <- US_Att[[2]] ``` -La pendiente de los ataques para _Estados Unidos_ es `r slope_US_Att` mientras que la pendiente de las certificaciones es `r slope_US_Cert`. +La pendiente de la tendencia en los ataques para _`r CountryCol[[3]][1]`_ es `r slope_US_Att` mientras que la pendiente de las certificaciones es `r slope_US_Cert`. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topCerts[[2]] -slope_GB_Cert <- (fit[5] - fit[1]) / 4 +GB_Cert <- GetCountriesCertsSingleEvolution(Cert_PerCountry, + CountryCol[[3]][2], + "2013", 2400, 0.5) + +GB_Cert[[1]] +slope_GB_Cert <- GB_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[2]] -slope_GB_Att <- (fit[5] - fit[1]) / 4 +GB_Att <- GetCountriesAttacksSingleEvolution(Attacks, + CountryCol[[3]][2], + "2014", 125, 0.5) + +GB_Att[[1]] +slope_GB_Att <- GB_Att[[2]] ``` -La pendiente de los ataques para _Reino Unido_ es `r slope_GB_Att` mientras que la pendiente de las certificaciones es `r slope_GB_Cert`. +La pendiente de los ataques para _`r CountryCol[[3]][2]`_ es `r slope_GB_Att` mientras que la pendiente de las certificaciones es `r slope_GB_Cert`. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topCerts[[3]] -slope_IN_Cert <- (fit[5] - fit[1]) / 4 +IN_Cert <- GetCountriesCertsSingleEvolution(Cert_PerCountry, + CountryCol[[3]][3], + "2013", 1875, -0.2) + +IN_Cert[[1]] +slope_IN_Cert <- IN_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[3]] -slope_IN_Att <- (fit[5] - fit[1]) / 4 +IN_Att <- GetCountriesAttacksSingleEvolution(Attacks, + CountryCol[[3]][3], + "2014", 60, -0.3) + +IN_Att[[1]] +slope_IN_Att <- IN_Att[[2]] ``` -La pendiente de los ataques para _India_ es `r slope_IN_Att` mientras que la pendiente de las certificaciones es `r slope_IN_Cert`. +La pendiente de los ataques para _`r CountryCol[[3]][3]`_ es `r slope_IN_Att` mientras que la pendiente de las certificaciones es `r slope_IN_Cert`. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -topCerts[[4]] -slope_JP_Cert <- (fit[5] - fit[1]) / 4 +JP_Cert <- GetCountriesCertsSingleEvolution(Cert_PerCountry, + CountryCol[[3]][4], + "2013", 7600, 1) + +JP_Cert[[1]] +slope_JP_Cert <- JP_Cert[[2]] ``` ```{r fig.width=4.5, fig.height=3} -topAttacks[[4]] -slope_JP_Att <- (fit[5] - fit[1]) / 4 +JP_Att <- GetCountriesAttacksSingleEvolution(Attacks, + CountryCol[[3]][4], + "2014", 30, -0.5) + +JP_Att[[1]] +slope_JP_Att <- JP_Att[[2]] ``` -La pendiente de los ataques para _Japón_ es `r slope_JP_Att` mientras que la pendiente de las certificaciones es `r slope_JP_Cert`. +La pendiente de los ataques para _`r CountryCol[[3]][4]`_ es `r slope_JP_Att` mientras que la pendiente de las certificaciones es `r slope_JP_Cert`. ### Evolución geográfica y tipo de ataque -Hasta ahora se han analizado por separado estas dos variables, pero la respuesta podria encontrarse en una combinacion de las mismas. Para ello se analizarán los tipos de ataque reportados en el pais en el que parece que la certificación es más efectiva, _Japón_, y en el que menos, _Estados Unidos_. +Hasta ahora se han analizado por separado el tipo de ataque y la localización geofráfica, pero la respuesta podría encontrarse en una combinación de las mismas. Para ello se analizarán los tipos de ataque reportados en el país con más certificaciones, _Japón_, y en el que más ataques recibe, _Estados Unidos_. + +```{r fig.width=9, fig.height=4} +ISO27001effectiveness::GetContinentAttackCol(Attacks, "US", "JP") +``` + +Como se pudo apreciar en un apartado previo, la ISO 27001 parece especialmente efectiva contra las técnicas de _Defacement_, _DDoS_ e _Injection_, en los gráficos previos se puede observar que _Estados Unidos_ tiene un menor porcentaje de este tipo de ataques con respecto a _Japón_. Para valorarlo mejor se representará a continuación cómo evolucionan con el tiempo en ambos paises. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -graphs <- ISO27001effectiveness::GetContinentAttackPie(Attacks) -graphs[[1]] +US_Att_Year <- ISO27001effectiveness::GetContinentAttackEvolution(Attacks, "US") + +US_Att_Year[[1]] ``` ```{r fig.width=4.5, fig.height=3} -graphs[[2]] +JP_Att_Year <- ISO27001effectiveness::GetContinentAttackEvolution(Attacks, "JP") +JP_Att_Year[[1]] ``` -Como vimos en el apartado previo, la ISO 27001 parece especialmente efectiva contra las técnicas de _Defacement_, _DDoS_ e _Injection_, en los gráficos previos podemos observar como para _Estados Unidos_ tiene un menor porcentaje de este tipo de ataques con respecto a _Japón_. Para valorarlo mejor se representará a continuación cómo evolucionan con el tiempo. +Como se puede observar, en _Estados Unidos_ se presenta una tendencia mayor a recibir los tipos de ataques que parecen menos afectados por la ISO 27001, mientras que en _Japón_ parecen matenerse. Se representarán las tendecias para cada técnica en ambos paises. ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -graphs <- ISO27001effectiveness::GetContinentAttackEvolution(Attacks) -graphs[[1]] +US_dds_Year <- GetAttackTypeSigleEvolution(US_Att_Year[[2]], + "DDoS", + "2014", + 75, 0) +US_dds_Year[[1]] +slope_US_dds <- US_dds_Year[[2]] ``` ```{r fig.width=4.5, fig.height=3} -graphs[[2]] +JP_dds_Year <- GetAttackTypeSigleEvolution(JP_Att_Year[[2]], + "DDoS", + "2014", + 4.4, 0) +JP_dds_Year[[1]] +slope_JP_dds <- JP_dds_Year[[2]] ``` -Como se puede observar, en _Estados Unidos_ se presenta una tendencia mayor a recibir los tipos de ataques que parecen menos afectados por la ISO 27001, mientras que en _Japón_ parecen matenerse. Se representarán las tendecias en ambos paises. +Para _DDoS_, la pendiente de la tendencia es menor en _Estados Unidos_(`r slope_US_dds`) que en _Japón_(`r slope_JP_dds`). ```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} -graphs[[3]] -slope_US_Oth <- (fit[5] - fit[1]) / 4 +US_def_Year <- GetAttackTypeSigleEvolution(US_Att_Year[[2]], + "Defacement", + "2014", + 46, 0) +US_def_Year[[1]] +slope_US_def <- US_def_Year[[2]] ``` ```{r fig.width=4.5, fig.height=3} -graphs[[4]] -slope_JP_Oth <- (fit[5] - fit[1]) / 4 +JP_def_Year <- GetAttackTypeSigleEvolution(JP_Att_Year[[2]], + "Defacement", + "2014", + 1.5, 0) +JP_def_Year[[1]] +slope_JP_def <- JP_def_Year[[2]] ``` -Efectivamente, la tendencia en _Estados Unidos_ tiene una pendiente mayor (`r slope_US_Oth`) que en Japón que es cercana al 0 (`r slope_JP_Oth`) lo que, aunque la gráfica sea irregular debido a la baja cantidad de casos, implica una constancia. - -# Viejo - -De los datos mostrados se pueden hacer diferentes observaciones: - -* De 2014 a 2015, USA pasa de tener 654 a 1247 empresas con certificación ISO 27001, sin embargo la cifra de ciberataques se mantiene constante de 383 a 386 ataques recibidos. De 2013 a 2014 por ejemplo, pasa de recibir 505 a 383 ataques pese a sólo haber pasado de 566 a 654 empresas con dicha certificación. -* Japón tiene un número inusualmente alto de empresas con la ISO 27001, no obstante sufre una cantidad de ciberataques comparativa a la de Israel, que tiene muchas menos empresas con la certificación. - -Ambas observaciones son de especial interés ya que ponen de relieve situaciones en las que de ser efectivo reformar los sistemas para cumplir la ISO 27001, debería poder apreciarse un efecto en la cantidad de ciberataques recibidos. En el caso de los USA, sólo podría explicarse mediante alguna de las siguientes hipótesis: +Para _Defacement_, la pendiente de la tendencia es menor en _Estados Unidos_(`r slope_US_def`) que en _Japón_(`r slope_JP_def`), aunque es muy parecida. -* Entre 2013 y 2014 se produjo un número especialmente alto de ciberataques a USA -* Se crean más empresas de las que logran certificarse, y además, sufren ataques antes de obtenerla +```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} +US_inj_Year <- GetAttackTypeSigleEvolution(US_Att_Year[[2]], + "Injection", + "2014", + 155, 0) +US_inj_Year[[1]] +slope_US_inj <- US_inj_Year[[2]] +``` +```{r fig.width=4.5, fig.height=3} +JP_inj_Year <- GetAttackTypeSigleEvolution(JP_Att_Year[[2]], + "Injection", + "2014", + 9, 0) +JP_inj_Year[[1]] +slope_JP_inj <- JP_inj_Year[[2]] +``` -La primera hipótesis puede ser comprobada con los datos que disponemos. A continuación se muestra una línea temporal de ciberataques globales entre los años 2012 y 2015. +Para _Injection_, la pendiente de la tendencia es menor en _Estados Unidos_(`r slope_US_inj`) que en _Japón_(`r slope_JP_inj`). +```{r fig.width=4.5, fig.height=3,out.extra='style="float:left"'} +US_Oth_Year <- GetAttackTypeSigleEvolution(US_Att_Year[[2]], + "Otros", + "2014", + 100, 0) +US_Oth_Year[[1]] +slope_US_Oth <- US_Oth_Year[[2]] +``` +```{r fig.width=4.5, fig.height=3} +JP_Oth_Year <- GetAttackTypeSigleEvolution(JP_Att_Year[[2]], + "Otros", + 3.5, + 3.5, 0) +JP_Oth_Year[[1]] +slope_JP_Oth <- JP_Oth_Year[[2]] +``` -Observamos que se produjo lo contrario, bajó el número de ciberataques. +Para _Otros_, la pendiente de la tendencia es mayor en _Estados Unidos_(`r slope_US_inj`) que en _Japón_(`r slope_JP_inj`). ## Conclusiones -Por lo observado anteriormente, se puede concluir que: -* La cantidad de ciberataques que recibe un país no se mitiga por el número de empresas que han obtenido la certificación ISO 270001 -Esto no lleva a concluir que obtener la certificación ISO 27001 no es efectiva para reducir el número de ciberataques, sino que probablemente dependa de factores externos ajenos a este estudio ## Trabajo futuro -Como trabajo futuro querríamos poder seguir en la línea de investigación acerca de los siguientes puntos: +Como trabajo futuro, el estudio podría seguir diversas líneas de investigación, resumidas en los siguientes puntos: -* ¿Qué factores producen un aumento o recesión en la cantidad de ciberataques recibidos? -* ¿Qué sectores industriales reciben más ciberataques? -* ¿Cuáles de esos sectores son los que más certificaciones obtienen? +* Mejorar la fuente de datos de ciberataques. Una fuente cuya administración, recopilación y mantenimiento no dependiera de una sola persona y fuera más constante, homogenea y detallada. +* Conectar los datos sobre web sites certificados por pais que nos provee la fuente de datos de certificaciones. +* Homogenizar los nombres y conectar los datos sobre sectores industriales que nos proveen ambas fuentes. +* Investigación más a fondo de los cambios realizados sobre la norma 27001, como la 27001:2013, para relacionarlos con las irregularidades en las curvas de ataques. +* Incorporar nuevas variables que puedan afectar al estudio, como parches importantes u otras normas parecidas. Creemos que la investigación de estas cuestiones puede dar más robustez a las conclusiones expuestas en este estudio. diff --git a/ISO27001effectiveness/Report.html b/ISO27001effectiveness/Report.html index cdd7f20..d77a342 100644 --- a/ISO27001effectiveness/Report.html +++ b/ISO27001effectiveness/Report.html @@ -11,7 +11,7 @@ -
Este apartado estudiará la relación entre la certificación ISO 27001 y los ataques producidos, pero teniendo en cuenta la variable geográfica, ya que es posible que la certificación, aunque sea internacional, se implemente de una mejor o peor forma según la región. En primer lugar se generalizará por continente.
--
Se puede observar a simple vista que los continentes que reciben más ataques, por una cuestión lógica de superficie e intereses, son por orden América, Asia y Europa. En cambio los continentes que mas certificaciones ISO 27001 obtienen son por orden Asia, Europa y América. Tanto África como Oceania podemos descartarlos en este estudio ya que sus porcentajes no son relevantes. Observemos ahora cómo influye esto en el tiempo.
+Este apartado estudiará la relación entre la certificación ISO 27001 y los ataques producidos, pero teniendo en cuenta la variable geográfica, ya que es posible que la certificación, aunque sea internacional, se implemente o funcione de una mejor o peor forma según la región. En primer lugar se generalizará por continente.
++
Se puede observar a simple vista que los continentes que reciben más ataques, por lo que podría ser una cuestión lógica de superficie y/o intereses, son por orden: América, Asia y Europa. En cambio, los continentes que mas certificaciones ISO 27001 obtienen son los mismos, pero en distinto orden: Asia, Europa y América.
+Tanto África como Oceania serán descartados en el resto del estudio ya que sus porcentajes no parecen relevantes.
-
Se puede observar que la tendencia de las certificaciones es creciente mientras que la de los ataques es decreciente, pero procederemos a comparar cada una individualmente para poder demostrarlo numéricamente y no solo aparentemente.
--
La pendiente de los ataques para América es -100.8 mientras que la pendiente de las certificaciones es 275.2.
--
La pendiente de los ataques para Asia es -58.4 mientras que la pendiente de las certificaciones es 1008.4.
--
La pendiente de los ataques para Europa es -57.4 mientras que la pendiente de las certificaciones es 1209.4.
-Todas las pendientes podrían representar la relación que buscamos, en la que un aumento en las certificaciones produce un descenso en los ataques.
-El análisis puede aumentar en profundidad estableciendo superficies geográficas más pequeñas y asi obtener más precisión, observemos lo que ocurre a nivel de paises. Se mostrarán a continuación los paises que superan aproximadamente un 2% de los ataques/certificaciones totales ya que la lista total de paises es demasiado extensa.
--
Como se puede observar en la parte de certificaciones destaca de largo Japón sobre los demás, que se encuentra bastante bajo en la lista de ataques. Y al reves pasa algo parecido, en los ataques destaca Estados Unidos por mucho mientras que ese mismo pais está muy bajo en certificaciones. A continuación observaremos la evolución temporal del top 3 paises en ataques recibidos y en certificaciones obtenidas, varios de ellos coinciden, tenemos por la parte de las certificaciones a Japón, por la parte de los ataques a Estados Unidos, y común a ambas Reino Unido e India.
--
La pendiente de los ataques para Estados Unidos es -59.8 mientras que la pendiente de las certificaciones es 210.3.
--
La pendiente de los ataques para Reino Unido es -11.8 mientras que la pendiente de las certificaciones es 320.4.
--
La pendiente de los ataques para India es -8.7 mientras que la pendiente de las certificaciones es 268.3.
--
La pendiente de los ataques para Japón es -7.4 mientras que la pendiente de las certificaciones es 262.4.
+Se puede observar que en conjunto la pendiente de la tendencia de las certificaciones es creciente, mientras que la de los ataques es decreciente. No obstante, se procederá a comparar cada continente individualmente para poder observarlo con más precisión.
++
Para América, la pendiente de la tendencia en las certificaciones es 275.2, mientras que la pendiente de los ataques es -100.8.
++
Para Asia, la pendiente de la tendencia en las certificaciones es 1008.4, mientras que la pendiente de los ataques es -58.4.
++
Para Europa, la pendiente de la tendencia en las certificaciones es 1209.4, mientras que la pendiente de los ataques es -57.4.
+El análisis continuará estableciendo superficies geográficas más pequeñas, aumentando así la precisión, para poder observar lo que ocurre a nivel de paises. Se mostrarán a continuación los que superan aproximádamente un 2% de las certificaciones totales y el 1,5% para los ataques (porque Estados Unidos recibe la gran mayoría y si no saldría solo), ya que la lista completa es demasiado extensa. Los nombres serán representados con los dos caracteres correspondientes al estándar ISO.
++
Como se puede observar, en la parte de certificaciones destaca de largo Japón sobre los demás, que a su vez se encuentra bastante bajo en la lista de ataques. Y, de un modo totalmente contrario, en los ataques destaca Estados Unidos por mucho, mientras que este mismo está muy bajo en certificaciones.
+El estudio continuará en profundidad con el top 3 de paises en número de certificaciones y en número de ataques recibidos, aunque algunos de ellos coincidan.
++
La pendiente de la tendencia en los ataques para US es -59.8 mientras que la pendiente de las certificaciones es 210.3.
++
La pendiente de los ataques para GB es -11.8 mientras que la pendiente de las certificaciones es 320.4.
++
La pendiente de los ataques para IN es -8.7 mientras que la pendiente de las certificaciones es 268.3.
++
La pendiente de los ataques para JP es -7.4 mientras que la pendiente de las certificaciones es 262.4.
Hasta ahora se han analizado por separado estas dos variables, pero la respuesta podria encontrarse en una combinacion de las mismas. Para ello se analizarán los tipos de ataque reportados en el pais en el que parece que la certificación es más efectiva, Japón, y en el que menos, Estados Unidos.
--
Como vimos en el apartado previo, la ISO 27001 parece especialmente efectiva contra las técnicas de Defacement, DDoS e Injection, en los gráficos previos podemos observar como para Estados Unidos tiene un menor porcentaje de este tipo de ataques con respecto a Japón. Para valorarlo mejor se representará a continuación cómo evolucionan con el tiempo.
--
Como se puede observar, en Estados Unidos se presenta una tendencia mayor a recibir los tipos de ataques que parecen menos afectados por la ISO 27001, mientras que en Japón parecen matenerse. Se representarán las tendecias en ambos paises.
--
Efectivamente, la tendencia en Estados Unidos tiene una pendiente mayor (21.2) que en Japón que es cercana al 0 (-1.11022310^{-16}) lo que, aunque la gráfica sea irregular debido a la baja cantidad de casos, implica una constancia.
+Hasta ahora se han analizado por separado el tipo de ataque y la localización geofráfica, pero la respuesta podría encontrarse en una combinación de las mismas. Para ello se analizarán los tipos de ataque reportados en el país con más certificaciones, Japón, y en el que más ataques recibe, Estados Unidos.
+ +Como se pudo apreciar en un apartado previo, la ISO 27001 parece especialmente efectiva contra las técnicas de Defacement, DDoS e Injection, en los gráficos previos se puede observar que Estados Unidos tiene un menor porcentaje de este tipo de ataques con respecto a Japón. Para valorarlo mejor se representará a continuación cómo evolucionan con el tiempo en ambos paises.
++
Como se puede observar, en Estados Unidos se presenta una tendencia mayor a recibir los tipos de ataques que parecen menos afectados por la ISO 27001, mientras que en Japón parecen matenerse. Se representarán las tendecias para cada técnica en ambos paises.
++
Para DDoS, la pendiente de la tendencia es menor en Estados Unidos(-22.4) que en Japón(-0.2).
++
Para Defacement, la pendiente de la tendencia es menor en Estados Unidos(-1.8) que en Japón(-0.8), aunque es muy parecida.
++
Para Injection, la pendiente de la tendencia es menor en Estados Unidos(-55.1) que en Japón(-3.9).
++
Para Otros, la pendiente de la tendencia es mayor en Estados Unidos(-55.1) que en Japón(-3.9).
De los datos mostrados se pueden hacer diferentes observaciones:
-Ambas observaciones son de especial interés ya que ponen de relieve situaciones en las que de ser efectivo reformar los sistemas para cumplir la ISO 27001, debería poder apreciarse un efecto en la cantidad de ciberataques recibidos. En el caso de los USA, sólo podría explicarse mediante alguna de las siguientes hipótesis:
-La primera hipótesis puede ser comprobada con los datos que disponemos. A continuación se muestra una línea temporal de ciberataques globales entre los años 2012 y 2015.
-Observamos que se produjo lo contrario, bajó el número de ciberataques.
Por lo observado anteriormente, se puede concluir que:
-Esto no lleva a concluir que obtener la certificación ISO 27001 no es efectiva para reducir el número de ciberataques, sino que probablemente dependa de factores externos ajenos a este estudio
Como trabajo futuro querríamos poder seguir en la línea de investigación acerca de los siguientes puntos:
+Como trabajo futuro, el estudio podría seguir diversas líneas de investigación, resumidas en los siguientes puntos:
Creemos que la investigación de estas cuestiones puede dar más robustez a las conclusiones expuestas en este estudio.