Skip to content
Snippets Groups Projects
Commit 0ba40213 authored by vincent.steinman's avatar vincent.steinman
Browse files

Nearly finish part 4 + doc

parent 649603d7
No related branches found
No related tags found
No related merge requests found
# __Rapport TP GoLang__
## __Introduction__
Dans le cadre du cours _ISC L322 - Sécurité des applications_, nous avons du réaliser une application en Go avec docker-compose et la modifier au fur et à mesure des séances d'exercices.
Dans le cadre du cours _ISC L322 - Sécurité des applications_, nous avons dû réaliser une application en Go avec docker-compose et la modifier au fur et à mesure des séances d'exercices.
### __But__
Le but de ce TP a été en premier lieux d'apprendre à essayé de sécuriser une application avec une API, mais également d'utiliser le Go.
Le but de ce TP a été en premier lieux d'apprendre à essayer de sécuriser une application avec une API, mais également d'utiliser le Go.
## __Code__
### __Session 1 - Construction une API RESTful en Golang__
En premier, nous avons simplement du créer la base du programme. Le but de ce programme est de gérer une salle de classe avec des élèves et des professeurs.
Les étudiands et professeurs ont tous un ID, nom de famille, prénom et une filière ou une classe.
En premier, nous avons simplement dû créer la base du programme. Le but de ce programme est de gérer une salle de classe avec des élèves et des professeurs.
Les étudiants et professeurs ont tous un ID, nom de famille, prénom et une filière ou une classe.
```'{"ID":"UUID", "Lastname":"Nom", "Name":"Nom", "filiere":"Software"}'```
### __Session 2 - Protection TLS__
Ensuite, il a fallut protégé la partie REST en utilisant une instance de nginx. Il a fallut générer une clé privée pour un certificat ainsi qu'un fichier docker-compose.yml
Ensuite, il a fallu protéger la partie REST en utilisant une instance de nginx. Il a fallu générer une clé privée pour un certificat ainsi qu'un fichier docker-compose.yml
### __Session 3 - Authentication__
Pour l'autentification, il a fallut créer notre API depuis Okta, faire plusieurs utilisateurs qui ont accès à l'API et un token pour que l'application depuis notre programme.
Pour l'authentification, il a fallu créer notre API depuis le site [Okta](https://developer.okta.com/), faire plusieurs utilisateurs qui ont accès à l'API et un token pour que l'application depuis notre programme.
Avec le package Gin, il a été possible de créer un serveur web RESTful.
### __Session 4 - Management de Secret__
Dans la ernière partie
Dans la dernière partie s'est faite avec un ajout d'identifiants d'authentification de base sur le programme Go et d'injection adaptative sur la partie docker afin de pouvoir gérer des _secrets_. Les _secrets_ des données blob tel que un mot de passe, une clé SSH, un certificat SSH, etc.
Cette partie m'a posé le plus de problèmes car j'ai trouvé que les consignes à suivre n'étaient vraiment pas claires et ne donnaient pas assez d'informations.
## __Conclusion__
Ce projet a été très compliqué pour moi car nous avons du tout apprendre par nous même
Ce projet a été très compliqué pour moi car nous avons du tout apprendre par nous même, ce qui a rendu le tout assez flou.
### __Tutoriels utilisés__
Voici la liste des tutoriels utilisés pour faire ce TP
- [Installation de Go 1.17.1](https://go.dev/doc/install)
- [Installation Docker](https://docs.docker.com/get-docker/)
- [Tutoriel Go Rest API](https://go.dev/doc/tutorial/web-service-gin)
- [Tutoriel go](https://docs.docker.com/language/golang/)
- [Clé TLS](https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm)
- [Analyseur TLS](https://github.com/tls-attacker/TLS-Scanner)
- [Implementation OIDC](https://developer.okta.com/blog/2021/02/17/building-and-securing-a-go-and-gin-web-application#how-to-validate-an-access-token-in-go)
- [Authentification de base](https://gobyexample.com/environment-variables)
- [Injection adaptative](https://docs.docker.com/compose/environment-variables/#pass-environment-variables-to-containers)
### __Problèmes rencontrés__
Durant ce projet, j'ai principalement rencontré deux problèmes.
- Comme évoqué ci-dessus, le premier était que je n'avais j'avais fait de Go et que durant les séances d'excercices, le professeur n'était pas là et donc, il fallait chercher et apprendre par nous même. Le TP était très guidé, mais le tout resait assez flou et parfois les instrucions pouvaient être un peu confuses.
- Comme évoqué plus haut, le premier était que je n'avais jamais fait de Go et que durant les séances d'exercices, le professeur n'était pas là et donc, il fallait chercher et apprendre par nous-même. Le TP était très guidé, mais le tout resait assez flou et parfois les instructions pouvaient être un peu confuses.
- Le deuxième est avec Okta. Après avoir créer mon compte et mon application, je n'ai pas pu y retourner par la suite pour continuer le TP. Quand je me connectais à la partie devloppeur, le site me redirigait sur le site principal et quand je retournais dans le section développeur, je n'était plus connecté. J'ai donc du recréer un compte et refaire cette partie.
\ No newline at end of file
- Le deuxième est avec Okta. Après avoir créé mon compte et mon application, je n'ai pas pu y retourner par la suite pour continuer le TP. Quand je me connectais à la partie développeur, le site me redirigait sur le site principal et quand je retournais dans la section développeur, je n'étais plus connecté. J'ai donc dû recréer un compte et refaire cette partie.
\ No newline at end of file
00L7j1C9ERvGMF85pp1LcONHTAZX8dfc6ygfDLZWX5
\ No newline at end of file
......@@ -14,4 +14,8 @@ services:
image: appsec:latest
container_name: appsec
expose:
- "8080"
\ No newline at end of file
- "8080"
web:
environment:
- DEBUG
......@@ -5,6 +5,9 @@ import (
"net/http"
"github.com/gin-gonic/gin"
"fmt"
"os"
"strings"
)
type student struct {
......@@ -172,6 +175,16 @@ func main() {
authorized.GET("/secret", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"secret": "The secret.",})
})
os.Setenv("FOO", "1")
fmt.Println("FOO:", os.Getenv("FOO"))
fmt.Println("BAR:", os.Getenv("BAR"))
fmt.Println()
for _, e := range os.Environ() {
pair := strings.SplitN(e, "=", 2)
fmt.Println(pair[0])
}
r.Run()
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment