Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierFlux principal

How to Create an Emailable Exchange Distribution List with Internal and External Contacts?

Scenario:

If you need a distribution list in Exchange that includes both internal organization contacts and external contacts—without requiring external users to be invited as guest accounts—there’s a simple way to achieve this.

In Exchange Online, external contacts are referred to as Mail Contacts. These allow you to add external email addresses to your organization’s address book, making them available for inclusion in distribution lists. By leveraging Mail Contacts, you can create a fully functional distribution list that includes both internal users and external recipients while keeping everything manageable within Exchange.

Managing email distribution lists efficiently is crucial for organizations that need to communicate with both internal and external contacts. While Exchange Online allows us to create Mail Contacts programmatically using PowerShell scripts or the Exchange Online Management API, automating this process is key—especially when integrating it with Dynamics 365 Marketing Lists.

The Automation Challenge

In my case, I wanted to automatically add new contacts from a specific Dynamics 365 Marketing List to a corresponding Exchange Distribution List. Initially, I considered using Power Automate to invoke a PowerShell script, but that introduced additional complexities:

  • Using Power Automate to trigger an Azure Automation Runbook
  • Managing authentication and execution permissions
  • Handling execution timing and monitoring

A More Efficient Approach: Logic Apps

Instead of relying on Power Automate, I found a better and more streamlined approach—using Azure Logic Apps. Unlike Power Automate, Logic Apps offer built-in functionality to create and execute Runbook Jobs directly within Azure Automation.

What This Blog Covers

In this post, I’ll walk you through:
✅ Setting up an Azure Automation Account
✅ Creating a Runbook to execute a PowerShell script that adds Mail Contacts
✅ Using Azure Logic Apps to trigger the Runbook
✅ Handling authentication across these services

By the end, you’ll have an end-to-end automation setup that seamlessly adds external contacts to Exchange Distribution Lists as soon as they join a Dynamics 365 Marketing List—without requiring manual intervention.

Let’s dive in! 🚀

Step 1: Set up the Azure Automation Account

  1. Log in to Portal Azure https://portal.azure.com/ and in the search box, type Automation Accounts


2. Click on Create, Select your Subscription and Resource group, and type in the Automation Account Name

2. Then click the Advanced Tab, and on the Managed Identities, select User Assign; we will set up the User Managed Identity in the next steps.

3. Click Review and Create.

Step 2: Setup the User Managed Identity

A common challenge for developers is the management of secrets, credentials, certificates, and keys used to secure communication between services. Managed identities eliminate the need for developers to manage these credentials.

A common challenge for developers is the management of secrets, credentials, certificates, and keys used to secure communication between services. Managed identities eliminate the need for developers to manage these credentials.

While developers can securely store the secrets in Azure Key Vault, services need a way to access Azure Key Vault. Managed identities provide an automatically managed identity in Microsoft Entra ID for applications to use when connecting to resources that support Microsoft Entra authentication. Applications can use managed identities to obtain Microsoft Entra tokens without having to manage any credentials.

So Let’s see how to setup the account with the Required Permissions!

  1. On the Search, Type Managed Identities

2. Click Create, Select the subscription, Resource group, and give it a name

3. Then Press Review and Create

4. Open the automation account that we have created in Step no. 1

5. Search for Identity, open the link, select user assigned, and click Add.

6. Add the managed identity that we have just created.

7. Next comes setting the Permissions for the Managed Identity, so go back and open the Managed Identity.

8. Go to Azure Role Assignments and add the Automation Contributor Role; this is required to enable the Logic app to execute the RunBook (we will be creating this in the next step) on the automation account.

9. Grant the Exchange.ManageAsApp API permission for the managed identity to call Exchange Online, Unfortunately, this step can’t be done through the Azure / Entra Portal, so we will be using Graphy API Explorer to achieve this.

Get the Managed Identity’s Object ID

Get Exchange Online Service Principal ID

Open Grap API Explorer, Login ,and run the below query and grap the Exchange online service Principal ID

Method: Get

https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '00000002-0000-0ff1-ce00-000000000000'

Assign the Exchange.ManageAsApp Permission

Using Graph Explorer API again, use the below to assign the Exchange.ManageAsApp Permission

POST https://graph.microsoft.com/v1.0/servicePrincipals/{MANAGED_IDENTITY_OBJECT_ID}/appRoleAssignments
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json

{
  "principalId": "{MANAGED_IDENTITY_OBJECT_ID}",
  "resourceId": "{EXCHANGE_ONLINE_SERVICE_PRINCIPAL_ID}",
  "appRoleId": "dc50a0fb-09a3-484d-be87-e023b12c6440"
}

10. Assign Microsoft Entra roles to the managed identity; you will need to assign the Exchange Administrator Role

In the Search type role and select Microsoft Entra Roles and administrators

11. Open Exchange Administrator Assignments and add the user Managed Identity by clicking the Add Assignments Button .. Global administrator privileges will be required for this.

Step 4: Import Exchange Management Modules

  1. Open the Automation Account that we have created in step 1
  2. Navigate to Shared Resources -> Modules
  3. Click Add Module

4. Click Browse from gallery

  1. Open the Automation Account
  2. Navigate to Process Automation -> Runbooks
  3. Search for PackageManagement and select and choose the Runtime Version 5.1

4. Repeat for Add PowerShellGet and choose Runtime Version 5.1

5. Repeat for ExchangeOnlineManagement and choose Runtime Version 5.1

Step 5: Create a runbook in Azure Automation

  1. Open the Automation Account
  2. Navigate to Process Automation -> Runbooks
  3. Click on Create a runbook. Make sure you are using Runtime Version 5.1 because PowerShell works only for this Version

4. Open the Run Book and click Edit in Portal.

5. Paste the below Powershell Script that connects to exchange

//The below piece of code sets parameters on the run book so that when called from a logic app we can pass these parameters to the run book.
param (
    [string]$MailContactName,
    [string]$MailContactEmail,
    [string]$DistributionList
)
// Connects to Exchange online via the managed Identity that have been setup in step 3
Connect-ExchangeOnline -ManagedIdentity -Organization Organisationdomain.onmicrosoft.com -ManagedIdentityAccountId {Managed Account Identity ID}

//Creates a mail contact in Exchange
New-MailContact -Name $MailContactName -ExternalEmailAddress $MailContactEmail

//Add mail Contact to the Distribution List
Add-DistributionGroupMember -Identity $DistributionList -Member $MailContactEmail

6. After that Click Save and Publish

7. You can then test the runbook by clicking the Test Pane on the Edit in Portal Screen of the runbook, entering the parameters and clicking start.

Step 5: Create the Logic App

So the Logic app will be created in a schedule and can query any enterprise connector like dataverse and then call the runbook that has been created in Step 5

  1. From the Azure Portal , Look for Logic Apps and click Add
  2. Choose the Hosting Plan, and here you can select the Consumption plan

3. Select the subscription, the Resource Group and add the logic app name

4. Click Review and Create and then Create

5. On the created Logic app, search for Identity, Navigate to user assigned and add the Managed identity created in step 2

5. Navigate to the Logic app designer. On the Add Trigger step, choose schedule and set the recurrence schedule. Then, add Action and look for Create Job and select the one under Azure Automation

6. Set the Connection Name and Choose the Authentication Type as Logic Apps Managed Identity

7. Select the Subscription, Resource Group, Automation Account, Run book and pass the required Parameters

8. Save and test the Logic App

Resources:

https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview

Source Control for Microsoft 365 Tenant Admins: Part III

In the third and final article in a series covering Git-based Source Control for Microsoft 365 Tenant Admins, Andy Schnieder covers how to leverage tools to streamline your workflow with Git and gain insight into some useful advanced techniques.

The post Source Control for Microsoft 365 Tenant Admins: Part III appeared first on Practical 365.

8 Power Platform DLP Policy Best Practices

Power Platform DLP Policies determine which data connectors can be used by apps & flows in an environment and which connectors are blocked. They are essential to put in place for every environment. DLP Policies prevent makers from accidentally exposing data to 3rd party services that should not have it. In this article I will share 8 Power Platform DLP Policy best practices and help you build a strategy to prevent data-leakage.

Table of Contents
1. Safeguard The Default Environment With A Restrictive DLP Policy
2. Set A Power Platform DLP Policy For Each New Environment
3. Fine-Tune Connector Endpoints And Actions
4. Use A Shared Power Platform DLP Policy For DEV-TEST-PROD Environments
5. Check Before Changing The DLP Policy For An Existing Environment
6. Create A Blanket Power Platform DLP Policy For The Entire Tenant
7. Update The Governance Error Message With An Admin Contact
8. Do Not Use Power Platform DLP Policy Resource Exemptions




1. Safeguard The Default Environment With A Restrictive DLP Policy

All users with a standard Power Apps/Power Automate license have access to the default environment with the Environment Maker role assigned. Many arrive at the default environment with no prior-training. They cannot be blocked from creating apps or flows so it is important to restrict their capabilities.

Move all non-blockable connectors to the business category.



Then move all blockable connectors to the blocked category.



Set the default group for the default environment to blocked. Any new connectors will automatically blocked unless they are non-blockable.



Apply the DLP Policy to only the default environment.




2. Set A Power Platform DLP Policy For Each New Environment

Every environment should have a DLP Policy in place before makers start to use it. When a new environment is requested, start by moving all non-blockable connectors to the business category. Then work with the environment owner to identify any additional connectors that are required (example: Salesforce, SQL Server, etc.) and move them to business as well. Move the remaining connectors to blocked.



Set the default group for the new environment to blocked.




3. Fine-Tune Connector Endpoints And Actions

All blockable connectors can specific actions blocked while allowing others. Others can also allow or deny specific endpoints. Consider limiting usage whenever moving a blockable connector into the business category.



In this example, the SQL Server connector is only allowed to access one endpoint. The idea of what an endpoint is differs for each connector (example: HTTP, Dataverse, Blob Storage, etc.).



Consider granting read-only access to a datasource using connector actions when users do not have a requirement to insert, update or delete data.




4. Use A Shared Power Platform DLP Policy For DEV-TEST-PROD Environments

New apps and flows should be created in a development environment. Then, they should undergo testing in a test environment and finally be released into a production environment. Include dev, test and prod environments in the same policy to ensure they are always subject to the same conditions.




5. Check Before Changing The DLP Policy For An Existing Environment

If a data policy changes after apps & flows have already been developed, it runs the risk of breaking them. The Power Platform Center Of Excellence Starter Kit includes a useful Power Apps app named DLP Editor. Run an impact analysis before switching the data policy to see which specific apps & flows will break. Then inform their creators and find a resolution.





6. Create A Blanket Power Platform DLP Policy For The Entire Tenant

A tenant-wide DLP Policy should be created for the sole purpose of blocking any potentially dangerous connectors in all environments. Do not be overly restrictive here. Blocking too many connectors at the tenant level will harm makers and make administration harder. Only block individual connectors on a case-by-case basis.

The blanket DLP policy will stack on top of the individual environment DLP policies. When one DLP Policy allows a connector and the other DLP Policy blocks a connector, the most restrictive policy wins.

Move all connectors to the business category.



Move individual connectors identified as risky into the blocked category.



Set the default group to business. Any new connectors added will automatically appear in the business category.



Choose add all environments when defining the scope.




7. Update The Governance Error Message With An Admin Contact

When a maker saves an app or flow that is not DLP Policy compliant they will receive a governance error message. Use PowerShell cmdlets to update the governance message and let makers know who they should contact to resolve the issue.



This PowerShell script was used to create the message above. Consider setting up a Microsoft Form and linking it in the governance message to collect requests for DLP Policy changes.

New-PowerAppDlpErrorSettings -TenantId 'TenantId' -ErrorSettings @{  
  ErrorMessageDetails = @{ 
    enabled = $True  
    url = "https://contoso.org/governanceMaterial" 
  } 
  ContactDetails= @{  
    enabled = $True 
    email = "admin@contoso.com" 
  } 
}




8. Do Not Use Power Platform DLP Policy Resource Exemptions

Apps and flow can be exempted from DLP Policies using these PowerShell cmdlets. Do not grant exemptions. If a resource requires a different DLP Policy consider moving it into another environment.


Did You Enjoy This Article? 😺

Subscribe to get new Power Apps articles sent to your inbox each week for FREE




Questions?

If you have any questions or feedback about 8 Power Platform DLP Policy Best Practices please leave a message in the comments section below. You can post using your email address and are not required to create an account to join the discussion.

The post 8 Power Platform DLP Policy Best Practices appeared first on Matthew Devaney.

7 Mistakes To Avoid When Creating A Power Platform Environment

Setting up a Power Platform environment the wrong way can have serious consequences. This includes data-loss with no recovery from backups, lack of security that allows undesired users into the environment, and poor performance that hurts end-users efficiency. In this article I will show you how to properly setup

Table of Contents
1. Picking The Incorrect Region
2. Choosing The Wrong Environment Type
3. Forgetting To Enter An Environment URL
4. Failing To Apply A Security Group
5. Missing Security Roles Assignment To Users
6. Neglecting The Setup Of Data Policies
7. Delaying Applying Power Platform Licenses




1. Picking The Incorrect Region

You only have one chance to select the proper region. If you choose the wrong one, there is no way to change it. The only way forward is to create another new environment and start again.

The environment’s region matters because it determines which datacenter your Power Apps, Power Automate flows and your data lives in. Choose the datacenter closest to your users to deliver the best performance. Also consider data sovereignty – data stored outside of your home country will be subject to the laws where it is stored.





2. Choosing The Wrong Environment Type

The default environment type Sandbox enables the Reset action which deletes all data & customizations within the environment and restores it to factory settings. You cannot perform a restore to recover lost data or customizations because the environment backups get deleted too. It is critical that you make sure the environments used for production do not have the type Sandbox.



This mistake can be easily fixed by opening the environment in the Power Platform Admin Center and pressing the Convert To Production action.




3. Forgetting To Enter An Environment URL

Changing the environment URL after initial environment setup has the potential to break Power Automate flows and other customizations. For example, a Power Automate flow that uses the environment URL stored in an environment variable would begin to fail.



To update the environment URL after an environment is created go to Power Platform Admin center and Edit the environment settings.




4. Failing To Apply A Security Group

An environment with no security group allows the system administrator to assign roles and share apps & flows with any user in the tenant. Only developers should be allowed in the development environments to ensure no customizations are broken. Likewise, only authorized users should be allowed in the production environment to make certain no sensitive data is leaked.



To update the Security group go to Power Platform Admin center and Edit the environment settings.




5. Missing Security Roles Assignment To Users

Users cannot run apps in an environment until they are assigned at least a Basic User security role. Developers require an Environment Maker role or System Customizer role to create new resources and view data. Additional custom security roles may be required as well. Do not assume that because a user appears in the environment’s Users list that they have a security role.

To assign a security role to a user, open the Users menu, select a user and then click Manage Security Roles.




6. Neglecting The Setup Of Data Policies

Data policies define which connectors are enabled or blocked and which connectors can be used with one another. By default all connectors can be used with no limitations. Your organization’s private data can be sent to 3rd party online services and consumed by their APIs.

If proper data policy for the environment is unknown upon creation consider move all Microsoft connectors to the business category while leaving the others in the non-business category. This will prevent Microsoft connectors from interacting with 3rd party APIs. Consider blocking the HTTP connector until you have a good reason to enable it. The HTTP connector can access any API on the internet.



Also, if you decide to enact a data policy after apps & flows have already been developed, you run the risk of breaking them. The Power Platform Center Of Excellence Starter Kit includes a useful Power Apps app named DLP Editor. You can run an impact analysis before changing the data policy to see which specific apps & flows will break. Then you would inform their creators and find a resolution.




7. Delaying Applying Power Platform Licenses

Developers and end-users alike cannot use being using premium apps, flows and other services without Power Platform licensing. Per app and per flow licenses must be added to the environment as an add-on within the Capacity menu. The sames goes for AI Builder credits and Power Pages capacity.

Per user licenses are assigned to a user account and do not need to be assigned to each new environment created.


Did You Enjoy This Article? 😺

Subscribe to get new Power Apps articles sent to your inbox each week for FREE




Questions?

If you have any questions or feedback about 7 Mistakes To Avoid When Creating A Power Platform Environment please leave a message in the comments section below. You can post using your email address and are not required to create an account to join the discussion.

The post 7 Mistakes To Avoid When Creating A Power Platform Environment appeared first on Matthew Devaney.

Blog Post: [Microsoft Teams] Utiliser les scénarios d'auto-évaluations à partir du centre d'administration Microsoft Teams

Alors que l'utilisation de Microsoft Teams continue de croître, Microsoft a développé des scénarios de diagnostic spécifiques à Teams qui couvrent les sujets d'assistance les plus fréquents et les tâches les plus courantes pour lesquelles les administrateurs demandent de l'aide à la configuration. Ces scénarios d'auto-évaluation fournissent des informations sur les problèmes connus et les instructions nécessaires pour résoudre rapidement les problèmes, dans aucune situation ces tests appliquent des modifications dans vos configurations. Auparavant, il était possible d'utiliser les tests d'autodiagnostic à partir portail M365 en naviguant dans la section Support et Nouvelle demande de service ou à partir de ce lien: https://docs.microsoft.com/fr-fr/microsoftteams/troubleshoot/teams-administration/admin-self-help-diagnostics Explication ici: [Microsoft Teams] Diagnostique d'auto-assistance pour les administrateurs Microsoft Teams Il existe désormais un nouveau conteneur d'autodiagnostic disponible sur le tableau de bord du Centre d'administration Teams. Il vous permet d'exécuter divers tests liés aux différents services Microsoft Teams, tels que la validation des utilisateurs, les assistants automatiques ou les files d'attente d'appels. Le contenur est disponible dans votre portail Teams: Dans la situation ou le conteneur n'est pas disponible dans votre centre d'administrateur Microsoft Teams, cliquez sur l'option "Modifier" en haut à droite de la vue du tableau de bord et ajoutez le widget Il est possible aux administrateurs de pouvoir personnaliser leur tableau de bord du centre d'administration Microsoft Teams. Comment personnaliser votre tableau de bord? Vous pouvez trouver une description ici: [Microsoft Teams] Nouvelle fonctionnalité : Personnaliser l'interface du tableau de bord du centre d'administration Microsoft Teams Une fois un scénario sélectionné, vous pouvez suivre les étapes pour établir un premier niveau de diagnostic. L'assistant vous offre un premier niveau de réponse vous permettant éventuellement de vous affranchir d'ouvrir un ticket de support pour des problèmes non complexes!

Microsoft Viva Learning infographic : How to order training course into a learning path

New features are coming fast on Microsoft 365 and you have trouble following the official roadmap ?

Every month, I publish a new infographic presenting a tip, a new feature on Microsoft teams / Microsoft Viva / Microsoft 365 solutions that you can use today on your platform.

As a manager or knowledge manager, How can I build a structured learning path with 3rd party content providers and custom content sources ?

,Context :

The big advantage of Microsoft Viva Learning is that you can bring together an entire catalogue of courses within Teams, which can come from your internal training materials as well as your third-party training content, such as LinkedIn Learning, Microsoft Learn, Pluralsight, EdX, and more. Employees can access them without leaving the Microsoft Teams app.

This is great for an employee who wants to learn at their own pace while staying in Teams, or for a manager who wants to assign relevant training to employees and track their progress through a Teams team, for example.

But if a manager wants to arrange the different courses in a precise order so that an employee can start with this one, continue with that one, and finish with that one, the stacking of courses does not allow for a precise order. So how do you arrange the different courses in order to have a logical sequence in the learning process?

,,Solution,

This is now possible with the introduction of learning paths in Viva Learning. Learning paths are a grouping of courses that can come from different sources, categorised and named with a topic or objective.

Administrators (M365 Administrator, Knowledge Administrator and Knowledge Manager) can create a learning path in the Admin tab of the Viva Learning application. The course created is fully customisable: course title, description, thumbnail and sections if required. Viva Learning also automatically calculates the total time of the course if the training elements included have a duration.

Once published, the course will appear in the course catalogue, on the home page, or on the features page if the administrator has chosen to feature it. And just like any other course within Viva Learning, someone will be able to bookmark it, add it to their collection or recommend it to a colleague.

This is an excellent feature that organisations will certainly appreciate to enrich their onboarding process or to train their teams on a specific topic in an orderly way, without worrying about the origin of the different learning courses.

,8 things to keep in mind about learning paths in Viva Learning

1 - M365 Admins and Knowledge Managers can create a learning path, and soon, with delegation flows, it will be possible to give permissions to others in the organisation to create learning paths, even if they do not have other admin permissions.

2 - Learning path creation is only available with paid Viva Learning licence plans.

3 - It is possible for a user to add a learning path to their personal learning collection.

4 - It is possible for an administrator to feature a learning path for all.

5 - It is possible for an administrator to restrict access to a learning path using "Manage permissions" and groups (a maximum of 10 can be selected).

6 - It is possible for an administrator to duplicate a learning path.

7 - It is possible for a Team Owner to add the learning path via the Viva Learning tab in a channel.

8 - You cannot add or remove content from a learning path once it has been published. You can only edit the title, description and thumbnail of a published learning path.

Microsoft Viva Learning Add a learning path

If you liked this tip and think it will be useful to others as well, feel free to share it.

Infographie Microsoft Teams : comment et pourquoi créer un canal partagé à l'externe

Les nouvelles fonctionnalités s'enchaînent à toute vitesse sur Microsoft 365 et vous avez du mal à lire la roadmap officielle ?

Chaque mois, je publie une nouvelle infographie présentant une astuce, une nouveauté sur les solutions Microsoft teams / Microsoft 365 que vous pouvez utiliser dès aujourd'hui sur votre plateforme.

Comment partager uniquement un canal d'une équipe avec une ou des personnes faisant partie d'une autre organisation (un autre tenant) ?

,Situation :

Ceci est le deuxième volet des canaux partagés. Nous l'avions vu précédemment avec les canaux partagés à l'interne, utile pour partager uniquement un canal quand un collègue ne fait pas partie de mon équipe Teams.

Intéressons-nous aujourd'hui au deuxième cas de figure avec les extérieurs. Si vous travaillez régulièrement avec d'autres organisations qui sont aussi sur Microsoft 365 ou si vous offrez vos services de conseil sur Microsoft 365 pour des organisations qui l'ont déployé, vous avez sans doute été invité dans l'organisation hôte.

Et pour y accéder, vous devez constamment faire la bascule entre votre tenant et celui de l'hôte ... ce qui est à la longue contraignant dans la bascule des accès. Alors comment disposer d'un accès sur une équipe hébergée dans une autre organisation tout en restant connecté avec son identifiant principal ?

,,Solution

C'est dorénavant possible aujourd'hui avec l'arrivée d'un troisième type de canal dans les équipes Teams : les canaux partagés qui peuvent être ouverts à des extérieurs. Une fois ceux-ci activés, les utilisateurs peuvent accéder au canal partagé Teams d'une organisation externe sans avoir à changer de tenant ou à se connecter avec un autre compte.

Votre organisation et celle des personnes que vous invitez doivent avoir une connexion directe B2B configurée par un administrateur pour activer la fonction des canaux partagés avec une autre organisation.

Qu'est-ce que la connexion directe B2B ?

C'est une fonctionnalité configurée par les administrateurs qui permet aux utilisateurs d'une organisation Microsoft 365 de partager un canal avec des personnes et des équipes d'autres organisations Microsoft 365.

Avec la connexion directe B2B, les utilisateurs des deux organisations peuvent travailler ensemble à l'aide de fonctionnalités telles que la conversation, les appels, le partage de fichiers et le partage d'applications à travers la canal partagé

Comment configure-t-on la connexion directe B2B ?

La connexion directe Azure AD B2B est désactivée par défaut. Pour activer la collaboration dans les canaux partagés avec des personnes d'autres

organisations, vous devez :

a) ajouter l'organisation et son nom de domaine complet

b) paramétrer les accès entrants (la possibilité pour des utilisateurs d'organisations externes d'accéder aux ressources de votre organisation). Vous pouvez appliquer ces paramètres à tout le monde, ou vous pouvez spécifier des utilisateurs, des groupes et des applications individuels.

c) paramétrer les accès sortants (la possibilité pour vos utilisateurs vos utilisateurs d'accéder aux ressources d'une organisation externe). Vous pouvez appliquer ces paramètres à tout le monde, ou vous pouvez spécifier des utilisateurs, des groupes et des applications individuels.

Comment un utilisateur externe peut-il être invité ?

Les utilisateurs externes peuvent être ajoutés à un canal partagé de deux manières différentes : c'est-à-dire en tant qu'individus ou en tant qu'équipe.

- En tant que personne (Partager avec des personnes) - Le propriétaire de l'équipe peut ajouter des utilisateurs externes et toute personne au sein de l'organisation dans un

canal partagé. Les utilisateurs qui sont ajoutés à un canal partagé recevront une notification et pourront accéder au canal instantanément.

- En tant qu'équipe (Partager avec une équipe) - Le propriétaire de l'équipe peut envoyer une invitation à l'utilisateur externe qui est un propriétaire d'équipe dans son organisation.

Le propriétaire de l'équipe acceptera l'invitation au nom de son équipe et il sera invité à sélectionner une équipe dont il est le propriétaire. L'équipe sélectionnée aura alors accès au canal partagé respectif en toute simplicité.

,9 Points d'attention sur le canal partagé à l'externe :

- Les mêmes que ceux abordés dans le post sur le canal partagé à l'interne

- La connexion directe B2B et une relation de confiance entre 2 organisations et n'est possible que si les deux organisations autorisent les mêmes accès vers et depuis l'autre organisation.

- Les invités (guests) ne peuvent pas être ajoutés aux canaux partagés. Lorsque vous partagez un canal avec une équipe qui a des invités, ces derniers n'ont pas accès au canal partagé

- Aucun objet utilisateur n'est créé dans votre annuaire Azure AD. Les utilisateurs sont définis par les paramètres d'accès Cross tenant et sont gérés dans Teams

- Si vous avez de l'accès conditionnel avec du MFA, vous devez configurer votre politique pour qu'elle accepte aussi l'organisation externe

- La personne que vous souhaitez inviter au canal partagé doit avoir un compte Teams professionnel ou scolaire dans Microsoft 365.

- Lorsque vous créez une équipe à partir d'une équipe existante, les canaux partagés de l'équipe existante ne sont pas copiés.

- Pas de composants Loop

- Pour les tenants education, les canaux partagés ne sont (malheureusement) pas pris en charge ni dans les équipes de classe ni dans les équipes Personnels

,Mes 3 recommandations

1- Ne vous lancez pas de suite dans la création de canaux partagés. Pensez avant tout à votre schéma de communication global. Pour ce type de collaboration, ai-je bien besoin d'un canal partagé ? ai-je bien besoin de ce canal partagé dans cette équipe ? Ai-je bien réfléchi au cycle de vie de ce canal ?

2- Comme pour les canaux privés, il est préférable dans un premier temps de n'accorder la création qu'à un groupe précisé de personnes ... à paramétrer dans le centre d'administration de Teams

3- Comme pour les canaux privés, faites bien attention à la gestion des propriétaires car un propriétaire de canal partagé ne peut pas être supprimé s'il est le dernier propriétaire d'un ou plusieurs canaux partagés.

De même, Si le dernier propriétaire du canal partagé quitte votre organisation, un membre du canal partagé de votre organisation est automatiquement promu propriétaire du canal partagé. S'il n'y a aucun membre de votre organisation à promouvoir, le canal partagé restera sans propriétaire. Un administrateur Teams devra alors assigner manuellement un propriétaire de canal.

Pensez donc à ajouter plus d'un propriétaire pour éviter cette situation.

ajouter un canal partagé dans une équipe Team

Si vous avez aimé cette infographie ou cette astuce sur Microsoft Teams et que vous pensez qu'elle sera également utile à d'autres personnes, n'hésitez pas à la partager

Comment administrer une base de données avec Adminer ?

Comment administrer une base de données avec Adminer ?

Que ce soit pour un site web ou des services auto-hébergés, vous disposez certainement d'une ou plusieurs bases de données, que vous devez administrer plus ou moins régulièrement. Vous connaissez probablement phpMyAdmin, l'un des outils les plus utilisés pour ça. Cette interface a été créée initialement pour gérer les bases de données MySQL depuis un serveur php. De nombreux hébergeurs, gratuits comme payants, le proposent, ce qui évite à l'utilisateur d'avoir à l'installer.

Comment administrer une base de données avec Adminer ?

Cette interface pratique permet d'exécuter, très facilement et sans grandes connaissances en bases de données, des requêtes comme les créations de table de données, insertions, mises à jour, suppressions et modifications de structure de la base de données, ainsi que l'attribution et la révocation de droits et l'import/export. Ce système permet de sauvegarder facilement une base de données sous forme de fichier .sql et d'y transférer ses données, même sans connaître SQL. L'utilisation de requêtes SQL reste toutefois possible.

Pour l'installation et l'utilisation de phpMyAdmin, je ne peux que vous rediriger vers la documentation officielle.

L'alternative : Adminer

Aujourd’hui je vous propose de découvrir un outil beaucoup moins connu que phpMyadmin, mais tout aussi efficace: Adminer.

Comment administrer une base de données avec Adminer ?

Adminer est outil léger et pratique qui remplit exactement le même rôle que phpMyadmin : vous permettre de gérer vos bases et tables MySQL en passant par une interface web.

Là où Adminer se démarque de phpMyAdmin, c’est par sa légèreté et sa simplicité d’installation. A l’inverse de phpMyadmin, qui nécessite un peu d’effort à l’installation et un minimum de configuration, Adminer se compose d’un seul et unique fichier php, qu’il vous suffit de déposer dans n’importe quel répertoire accessible sur le web. Adminer est disponible pour MySQL, PostgreSQL, SQLite, MS SQL et Oracle.

Pour l'installation, c'est très simple ! Il suffit de télécharger le fichier php (depuis la page github du développeur) sur votre hébergement, dans un dossier accessible et de vous rendre ensuite à l'adresse www.votresite.com/adminer.php .

Comment administrer une base de données avec Adminer ?

Il vous suffit alors de renseigner votre identifiant et mot de passe MySQL (et accessoirement un nom de base de données, mais ce n’est pas obligatoire) et de vous authentifier.

Comme vous pouvez le voir, l’interface est disponible en plusieurs langues, dont le Français. Toutes les fonctions qu’on peut attendre sont là : gestion (création, édition et suppression) de base de données, gestion des tables, des champs, importation de fichier SQL, exécution de requête SQL directe, gestion des utilisateurs MySQL, privilèges…

Comment administrer une base de données avec Adminer ?
Comment administrer une base de données avec Adminer ?
Comment administrer une base de données avec Adminer ?
Comment administrer une base de données avec Adminer ?

Il est possible d'étendre les fonctionnalités d'Adminer en lui ajoutant des plugins, pour ajouter le support d'extensions xml ou json dans les exports, ou encore changer le thème de l'interface, en ajoutant le fichier adminer.css aux côtés du fichier adminer.php.


Mise en place d'Adminer dans un environnement Docker

Avec les conteneurs que nous mettons en place au travers des articles rédigés, nous pouvons avoir besoin d'accéder à une base de données, pour corriger des entrées, exporter ou importer des données, ... Il est également possible d'ajouter Adminer en tant que conteneur Docker, dans une stack existante (ou dans sa propre stack).

Prenons l'exemple de la stack Nextcloud, qui contient une base de données mariaDB. Nous rajoutons un service adminer comme suivant :

version: '3.8'

services:
  nextcloud_db:
.....

  nextcloud_app:
.....

  adminer:
    image: adminer
    container_name: adminer
    ports:
      - 8080:8080  # Port sur lequel vous accéderez à l'interface web d'Adminer
    depends_on:
      - nextcloud_db  # Permet de s'assurer que le conteneur de la base de données est opérationnel avant de lancer le conteneur Adminer
    restart: unless-stopped

En relançant la stack avec la commande docker-compose up -d ou depuis Portainer, vous devriez pouvoir accéder à Adminer depuis votre navigateur à l'adresse http://<IP.HOTE.DOCKER>:8080. Le serveur est le nom du conteneur, et les identifiants sont ceux que vous avez défini dans le fichier .env.

Comment administrer une base de données avec Adminer ?

Conclusion

Au final, quel est l'intérêt d'Adminer par rapport à phpMyAdmin ? Comme je l'ai dit, la simplicité d'installation ! Un simple fichier php à déposer où bon vous semble, ou bien quelques lignes pour lancer un conteneur et c'est terminé ! L'autre point intéressant, c'est l'absence de configuration à faire. Adminer est immédiatement fonctionnel. Enfin, dernier point non négligeable, et vous l'aurez peut-être remarqué, mais étant bien plus léger, Adminer est également plus réactif à l'utilisation.

Si vous avez des questions sur cet article, n'hésitez pas à laisser un commentaire ou à venir nous retrouver sur le groupe Telegram de la communauté pour échanger.

Syncthing, la synchronisation de fichiers dopée aux stéroïdes

Qui a déjà utilisé différents ordinateurs sait la complexité que représente la synchronisation de fichiers entre de ceux-ci. Cet article traite justement de la question, via un logiciel, Syncthing, qui permet de régler ce souci de façon assez magique 🪄.

🧱 Architecture des systèmes de synchronisation

Il existe principalement deux architectures permettant la synchronisation des fichiers que je vais vous décrire.

➡️ Client/Serveur

C'est l'architecture la plus classique, proposée par de gros acteurs du secteur comme Google, Dropbox, Apple ou encore Nextcloud. Le principe est relativement simple, tous les fichiers sont uploadés vers un serveur chez l'opérateur de cloud. Lorsque l'on utilise un autre appareil, les changements sont téléchargés des serveurs de cet opérateur.

Un schéma montrant un exemple d'architecture client/serveur

C'est le modèle le plus répandu pour une raison, c'est le plus simple à mettre en place, et ça l'était encore plus il y a quelques années. Cependant, depuis, un autre modèle devient de plus en plus commun.

🕸️ Mesh

Cet autre modèle, ce sont les réseaux maillés, ou mesh. Plutôt que de s'appuyer sur un serveur central, qui peut se retrouver inopérant à n'importe quel moment, on utilise tous les appareils à la fois comme serveur et comme client. Cela permet à cette topologie d'être beaucoup plus résiliente.

Une schéma montrant un exemple d'architecture mesh

On peut voir sur ce schéma que même si l'ordinateur principal n'est pas en capacité d'accéder à certains appareils directement (parce que ceux-ci n'ont pas accès à internet par exemple) cela ne pose aucun problème car, chacun d'entre eux étant interconnecté. Les modifications finissent par être propagées partout.

On a aussi un autre avantage de taille, si deux appareils sont sur le même réseau local, ils n'auront pas à passer par Internet. Ce qui permet d'accélérer grandement la vitesse de mise à jour entre les appareils.

C'est ce modèle qu'utilise Syncthing, le logiciel dont nous allons traiter ici.

📦 Syncthing

Syncthing est un logiciel libre créé en 2013, il est activement supporté, compte quelque 80 000 utilisateurs, et a depuis sa création, permit de transférer 4,785 Po (4 785 000 Go) ! Il s'appuie sur un protocole appelé BEP (Block Exchange Protocol) que je vais tâcher de vous décrire ici.

BEP est un protocole qui s'appuie sur une structure de données assez simple, chaque appareil (device) a une liste de dossiers (folder). Ces dossiers sont découpés en plus petits blocs entre 16 Ko et 2 Mo. Syncthing stocke le hash de chacun de ces blocs, et échange cette liste de hash avec les autres appareils afin de savoir si la version d'un dossier stocké est à jour.

Un exemple de dossier découpé en blocs

Si le hash d'un des blocs n'est pas le même, l'appareil va alors synchroniser ce bloc avec l'autre appareil ayant la version plus récente.

Il existe trois modes d'échanges entre les appareils, send only, receive only, et send & receive. Le premier est particulièrement utile sur un ordinateur qui voudrait envoyer des sauvegardes vers un serveur par exemple, l'ordinateur ne veut pas recevoir de fichier du serveur, juste en envoyer. À l'inverse, dans ce cas, le serveur serait en receive only. Le mode send & receive est tout particulièrement utile pour synchroniser, par exemple, le dossier ~/Documents entre deux ordinateurs, permettant à l'un et l'autre d'effectuer des modifications sur un document et d'être toujours synchronisé.

Toute l'ingéniosité de Syncthing repose dans son optimisation, le protocole principalement utilisé pour le transfert de fichier est Quic, un parfait compromis entre la robustesse de tcp et la vitesse d'udp. Syncthing optimise aussi grandement le transfert en lui-même, en permettant par exemple de ne pas retransférer certaines données si elles sont déjà présentes dans d'autres fichiers. Par exemple, si je veux synchroniser mon ~/Dev, et que j'ai dedans plusieurs projets en JS, plutôt que de télécharger le dossier node_modules à chaque nouveau projet créé sur une machine distante, le logiciel va copier les fichiers déjà existant sur le disque pour des bibliothèques qui auraient déjà été téléchargées par exemple.

Ces optimisations permettent un gain de bande passante assez incroyable. D'après les statistiques de Syncthing récoltées sur l'ensemble des appareils ayant autorisé la télémétrie, la réutilisation des données d'autres fichiers aurait permis d'économiser 8 % de bande passante !

Totals to date Transferred    34.62 PiB (38.72%) Saved by renaming files  2.1 PiB (2.35%) Saved by resuming transfer  4.29 PiB (4.80%) Saved by reusing data from old file    40.23 PiB (45.00%) Saved by reusing shifted data from old file  827.11 TiB (0.90%) Saved by reusing data from other file    7.36 PiB (8.23%)

Cet article touche à sa fin, j'espère que vous en savez maintenant un peu plus sur Syncthing, pour finir j'aimerais vous donner une dernière astuce. Si vous comptez utiliser Syncthing entre deux ordinateurs que nous n'utilisez pas en même temps (ex. un ordinateur portable pour les cours et un fixe chez soi) je ne pourrais que vous conseiller de mettre Syncthing sur un NAS, un VPS ou même un simple Raspberry Pi fera l'affaire, cela permettra de synchroniser les fichiers même si un des deux ordinateurs n'est pas allumé. Merci d'avoir suivi cet article ! 😄

Comment fonctionne la compilation de programme

Dans cet article je vais vous parler de la compilation d'un programme informatique, quelles sont ses "phases" et leurs utilité, et tout ce qui se cache derrière tout ça.

Initialement cet article devait traiter de la compilation, de l'interprétation et de la semi interprétation, mais il y'a tellement de chose à dire que vous parler de tout ce bon monde dans un seul est unique article serait un enfer pour vous, alors j'ai décidé de faire un article pour chacun de ces sujets.

La Compilation

Alors, premièrement qu'est ce que c'est la compilation ?

La compilation permet, en bref, de transformer/traduire le code source d'un programme en langage machine pour qu'il puisse être exécuté par votre processeur.

Pourquoi ne pas directement progammer en langage machine alors ?

Je pense que vous êtes des êtres humains (sinon faudrait complètement revoir nos statistiques sur le blog). Le langages machine, comme son nom l'indique, c'est du langage pour la machine, et vous en ête pas une ... ~~en tout cas pas encore~~ il vous faut donc une alternative au langage machine pour nous, un langage qui se rapproche du language humain pour que ce soit plus simple de lire et/ou écrire du code.

Le premier language créé pour "humaniser" le langage machine, c'est le langage d'assemblage ou plus couramment dit: "language d'assembleur". Voici un exemple du fameux "Hello world !" en language d'assembleur sous Linux 64bits

bits 64
global main

section .data
Hello db "Hello world !", 10, 0

section .text

main:
    push rbp
    mov rbp, rsp
    mov rax, 1 ; syscall write
    mov rdi, 1 ; stdout
    mov rsi, Hello
    mov rdx, 15 ; size of "Hello world!\n" + nullbyte
    syscall
    leave

Je ne vais pas vous expliquer qui fait quoi dans ce code, les commentaires reste assez explicite et de toute façon ce n'est pas l'objet de cet article.

Et le language machine correspondant (de la section main) ressemble à ceci:

55                          
48 89 e5            
b8 01 00 00 00      
bf 01 00 00 00      
48 be 28 40 40 00 00
ba 0f 00 00 00      
0f 05                
c9

Vous voyez c'est le jour et la nuit, même si le language d'assemblage reste assez austere, ca reste humainement plus lisible que du language machine.

Languages moderne

Heureusement aujourd'hui les languages de programmation ont changé notamment grace à la venue du language B dont le language C s'est inspiré et qui a ensuite inspiré quasiment tout les autres languages suivant celui-ci. Si vous jettez un oeil aux langages précédant le langage B ; Fortran, Cobol, vous remarquez qu'ils restent plus ou moins similaires au language d'assembleur.

Exemple de "Hello world !" en C:

#include <stdio.h>

int main() {
    printf("Hello world !");

    return 0;
}

C'est tout de suite plus agréable que le language d'assembleur !

Les étapes de la compilation

Bon, maintenant que vous avez compris que c'était plus drôle d'écrire avec un language autre que le language machine, je vais vous parler des différentes phases de la compilation.

Les 3 plus grosses phases (les plus souvents présentées dans les schémas) sont:

  • La phase préprocesseurs
  • La compilation
  • L'édition de liens

Ce sont les plus grosses étapes, mais il y'en a d'autres.. pleins d'autres qui se passent avant, pendant et après ces 3 là.

Le prétraitement

Cette phase permet de substituer des macros dans le code. Prenons les exemples suivants

#include <stdio.h> #define TOTO 42

Lors de cette phase, tout le contenu du fichier stdio.h est inséré dans le fichier source.

Tous les TOTO sont remplacés par 42.

Il existe aussi des préprocesseurs "conditionnels" (if, else, ...) qui sont souvent utilisés, par exemple lorsque le programme est en developpement on peut écrire des macros qui permettent d'ajouter du code pour faciliter le débug du programme, mais lors de la publication de la version "finale" du programme, on peut ommetre certains codes pour ne pas surcharger le code source avec du code en plus.

Exemple:

#if DEBUG
    assert(var == false)
    assert(var2 > var3)

    printf("Tout est correct");
#endif

Si lors de la compilation on spécifie la macro DEBUG le code au dessus sera pris en compte dans le code source.

Mais si on ne spécifie pas cette macro, la phase de prétraitement passera outre ce code la.

L'analyse lexicale

Et oui, très souvent oublié dans les petits schémas récapitulatifs, il y'a une analyse lexicale. Elle est réalisée en parcourant le code source en une seul fois.

Cette phase permet de verifier si les mots existent dans le language et à quel unité de lexique ils appartiennent puis les "découpes" de sorte à former des "token".

Unité de lexique

  • identifiants: une_variable, une_fonction, x, etc...
  • mots-clefs: if, while, return, for, extern, auto, static, etc...
  • ponctuation: }, (, ;
  • opérateurs: +, <, =, <=, ==, etc...
  • littéraux 42, 69.0f, "hello", 0xb00b

Une fois l'analyse lexicale faites les "tokens" sont générés. Par exemple, prenont le code suivant:

int ma_variable = 32 + 8 + 2;

On se retrouve avec les tokens suivant:

int : mot-clef du type entier ma_variable : identifiant = : opérateur d'affectation 32 : entier littéral + : opérateur d'addition 8 : entier littéral + : opérateur d'addition 2 : entier littéral ; : fin de l'initialisation

Dans l'analyse lexicale il se passe encore plein d'autre chose comme le "balayage" et "L'évaluation" mais qui sont justes des étapes intermédiaires pour arriver à l'objectif de l'analyse léxicale.

En conclusion, l'analyseur lexical vérifie si les mots existent bien et les transforme en token pour l'analyseur syntaxique.

Par exemple en language Francais: Loubala n'est pas correcte, ce mot n'existe pas dans la langue Française.

L'analyse syntaxique

L'analyse syntaxique suit directement l'analyse lexicale et permet de vérifier si les mots/groupes de mots forment des "phrases" conforme du language en analysant les tokens générer par l'analyse lexicale.

Si on reprend l'exemple avec le Francais: Manger boire. Cette suite de mot est lexicalment correct, ces mots existent dans la langue Française, mais synaxiquement fausse car ils ne forment pas une phrase correct en Francais.

L'analyseur syntaxique genère un arbre de syntaxe abstraite (ASA) qui sera utilisé pour l'analyse sémantique.

Arbre de syntaxe abstraite

ASA

Analyse sémantique

Cette phase suit immediatement l'analyse syntaxique. Ici, on analyse l'ASA fourni par l'analyseur syntaxique. L’objectif de cette phase est de vérifier que toutes les phrases écrites dans l’ASA ont un sens dans le language utilisé.

Par exemple dans la langue Francaise: L'avion manges des fruits.

  • Le lexique est correct, chaques mots utilisé existent dans la langue Francaise.
  • La syntaxe est également correcte, c'est une phrase conforme à la langue Francaise.
  • Mais sémantiquement fausse car la phrase ne veut rien dire.

C'est lors de l'analyse sémantique que le compilateur génère la table des symboles qui permet, dans les grandes lignes, de ranger les identificateur avec leur type, l'emplacement mémoire, la portée, la visibilité, etc.

Three Address Code

Le "Thee Address Code" (TAC) est une optimisation de compilation qui permet de traduire chaque instruction en maximum 3 opérandes (comme en language d'assembleur).

Par exemple, si on reprend le code suivant:

ma_variable = 32 + 8 + 2

en TAC cela donnerait:

t1 = 32 + 8
t2 = t1 + 2
ma_variable = t2

L'optimisation du code

Ici le code est optimisé (il peut aussi l'êtres avant la génération de code intermédaire 'TAC')

Language Assemblage

Le code est ensuite traduit en langage d'assembleur (qu'on a vu dans la première section de cet article)

Assembleur

Avant dernière étape, le langage d'assembleur est ensuite passé à un suspense assembleur pour être re suspense assemblé !

Ce qui nous donne un fichier "objet" contenant du code machine.

Édition de lien

Enfin nous voila à la dernière étape ! L'édition de lien.

Cette étape permet de lier plusieur fichiers objet qui on été générés par le compilateur.

Quand un programme dépend d'autre fichier, notamment de la librairie standard du language (la libc par exemple), il faut spécifier à votre programme où se trouve le code de printf ou fgets ou tout autre fonction se trouvant dans la librairie standard, car ce que vous incluez avec le préprocesseurs include c'est juste les déclaration des fonctions et autre macro, donc votre main a connaissance de la fonction printf il sait qu'elle type de donnée la fonction retourne, le type et nombre d'arguments que la fonction a besoin, mais vous n'avez pas le code de la fonction, le code est dans la librairie libc.

Il faut donc lier cette librarire a votre programme et cela ce fait avec l'éditeur de lien.

Schéma récapitulatif

En résumé nous avons ce schéma: schema

C'est fini pour cet article, j'espère qu'il vous a plu, je pense avoir parlé du plus important, il se passe bien évidemment d'autre chose lors de la compilation mais c'est plus pour de l'optimisation ou parce que le language utilise des choses plus complexes comme le polymorphisme avec les templates ou les fonctions inlines etc (qui sont comme des macro-fonctions mais substitué lors de la compilation et non lors de la phase prétraitement). Mais j'estime avoir parlé du plus important et du plus basique.

Découverte des permissions sous Linux

En utilisant Linux, vous avez probablement rencontré des erreurs telles que "permission denied" (permission refusée). Souvent des erreurs du genre sont frustrantes, pourquoi le système que j'ai installé me refuse l'accès ? Le but de cet article est de comprendre en détail le fonctionnement des permissions sous Linux et de vous aider.

Pour parler de droit sous Linux, il faut bien comprendre que tout est fichiers, que ce soit les configurations, les périphériques ou encore les informations sur un pid. Comme tout est fichier, les droits d'accès à chacun sont donc primordiaux. Par exemple, un utilisateur non privilégié qui accède à /dev/sda (dans le cas où votre disque est sda) serait dramatique.

Permission de base

Pour pallier à ces soucis, Linux dispose de droits plutôt basiques se limitant à :

  • read : autoriser à lire le fichier
  • write : autorise à écrire le fichier
  • execute : autorise à exécuter le fichier

Pour les dossiers, c'est la même chose mise à part que execute autorise à traverser le dossier et read permet de lister les fichiers. On peut prendre un exemple :

% ls -l
total 8
-rwx------. 1 raiponce raiponce 32 19 mar 16:17 f
-rw-r-----. 1 raiponce pascal   0 19 mar 16:15 b
-rwxr-xr-x. 1 raiponce raiponce 32 19 mar 16:16 c

Notation droit linux

On voit tout de suite l'utilité des lettres mises en gras plus haut. Elles sont utilisées pour visualiser les droits. Sous Linux de base, il y a 3 groupes de permissions :

  • utilisateur
  • groupe
  • tout le monde

Dans notre exemple, le fichier f est lisible, modifiable et exécutable par raiponce, pour le fichier. b est lisible et modifiable par l'utilisateur (ici raiponce) et lisible pour le groupe (ici pascal). Pour c tout le monde peut lancer et lire, mais seule raiponce peut modifier.

Les 2 principaux utilitaires pour gérer les droits de manière basique sur les fichiers sont chmod et chown. Pour chmod on peut l'utiliser soit en lui disant quel droit ajouter ou enlever à un fichier ou répertoire, par exemple :

chmod g+rw f

Ajoute les droits de lecture et écriture au groupe propriétaire sur le fichier f.

Une autre méthode consiste à utiliser des "nombres" ou chaque chiffre corresponds à une catégorie de droit (utilisateur, groupe, tous) et des permissions.

Droit Valeur en lettres Valeur en nombre
Aucun droit --- 0
exécution seulement --x 1
écriture seulement -w- 2
écriture et exécution -wx 3
lecture seulement r-- 4
lecture et exécution r-x 5
lecture et écriture rw- 6
tous les droits rwx 7

Vous l'avez probablement remarqué, mais ce ne sont que de simple addition, par exemple pour rw c'est le résultat de 2+4, il suffit donc de retenir le numéro lié à chaque droit et non tout le tableau.

Reprenons donc un exemple, donnons donc accès au groupe pascal en lecture et à l'utilisateur raiponce en lecture écriture aux fichiers x, ce qui nous donnera la suite de commande :

chown raiponce:pascal x #On met l'utilisateur raiponce et le groupe pascal propriétaire
chmod 0640 x #On donne les droits : rw-r-----

Masquage

Un autre aspect important est le "masquage", cela permet de définir les permissions pour les nouveaux fichiers ou dossiers. On peut voir le masque d'un dossier via umask -S. Le masque est une soustraction, par exemple umask 022 donnera les permissions 644 sur un fichier et 755 sur un dossier. Cela peut paraitre étrange, les permissions du fichier devrait être 755 non ? En fait, le masque par de la valeur 666 et non 777 (il faut donc manuellement donner les droits d'exécuter, le masque ne peut le faire) mais reste 777 pour les dossiers. Par exemple, si on veut que les nouveaux fichiers aient comme droit rw-r----- (640) on va pouvoir faire : umask 027, ce qui donnera aux dossiers les permissions 750.

Attributs spéciaux

Sous linux il existe des permissions plus poussée et fine pour donner certains droit à des binaires. Cela permet d'éviter de devoir lancer en root (root est le "super-utilisateur", c'est à dire qu'il a presque tous les droits).

Setuid et Setgid

Ces droits permettent à un binaire de se lancer en tant qu'une autre personne. Par exemple, si le fichier i_am_root est propriété de root il pourrait lancer un shell en root. Il est donc primordial de ne pas donner le setuid (souvent abrégé suid) ou setgid sur n'importe quel fichier. Bien sûr la plupart des programmes qui requiert un suid ou guid rajoutent des règles pour limiter les utilisateurs pouvant utiliser entièrement la commande (on peut le voir dans le code de passwd par exemple). Pour rajouter un suid ou sgid c'est toujours la commande chmod qui le permet. Par exemple : chmod ug+s y rajouteras un suid et guid au fichier y. On peut aussi utiliser la notation à base de nombre, pour ça il faut utiliser 4 chiffres au lieu des 3 pour les permissions simple. 2 signifie un setguid et 4 un setuid, l'équivalent du chmod montré juste au dessus serait donc chmod 6755 (dans le cas ou les permissions du fichier sont rwxr-x-rx).

Sticky bit

Un autre attribut qui peut être intéressant c'est le sticky bit. Il permet d'autoriser uniquement l'utilisateur propriétaire ou root de modifier, renommer ou supprimer. Un des usages courrants est le dossier /tmp, de nombreux dossiers y sont créer en pouvant être écrit par plusieurs personnes mais ne doivent pas être supprimé. On peut voir via ls -l si un fichier le présente :

drwxrwxrwt.  2 root     root      80 31 mar 13:13 .X11-unix

Ici on peut voir qu'il est présent, c'est la notation t qui l'indique. Pour le retirer on peut utiliser chmod pour le supprimer, avec la syntaxe classique : chmod +t pour ajouter, -t pour retirer ou via la notations en nombre, il est le numéro 1 donc par exemple chmod 1666 fichier.

Capabilities

Certaines actions sous Linux ne peuvent pas être faites en tant que simple utilisateur et pour éviter de devoir lancer en tant que root, ce qui est regrettable niveau sécurité, Linux possède ce qu'on nomme des capabilities. Elles permettent par exemple d'autoriser à un programme d'écouter un port en dessous de 1024. On peut lister celles présente sur un fichier via getcap. Par exemple pour ping on aura : /usr/bin/ping cap_net_raw=ep qui permet d'utiliser des socket raw. On peut voir dans la page de man : capabilities(7) la liste de celles-ci et leurs descriptions. Pour donner une capabilities à un binaire, on peut utiliser setcap. Par exemple setcap 'cap_net_bind_service=+ep' listener donne le droit à listener d'écouter sur un port plus faible que le 1024.

Chattr

chattr est un utilitaire qui permet d'attribuer certaines options à des fichiers ou dossiers, par exemple l'attribut i qui permet de rendre un fichier non modifiable, supprimable et aucun lien ne peut être fait vers lui. La commande à une syntaxe proche de chmod : chattr +i fichier pour donner l'attribut i et -i le retirer. Il existe d'autres options pouvant être intéressantes, je vous laisse lire la man page de chattr(1).

J'espère que cet article moins poussé techniquement que d'habitude vous auras plus, ça commençait à faire longtemps qu'on n'avait plus rien sorti 😅. On va essayer de vous sortir des articles d'ici pas trop longtemps, pour ne rien spoiler il y a un gros article qui ne parle pas directement d'informatique en préparation ;).

À quoi sert initramfs ?

Pour la faire courte

Initramfs est un système de fichier monté dans la RAM lors de l'initialisation du noyau (kernel).

Un peu plus de détails

Initramfs est présenté sous forme d'archive cpio, c'est en quelque sorte l'ancêtre de tar.

Pourquoi ne pas utiliser tar ?? 🧐

Tout simplement parce que le code était plus facile à mettre en œuvre dans Linux et qu'il prend en charge des fichiers de périphériques, contrairement à tar.

L'archive contient les fichiers, scripts, bibliothèques, fichiers de configuration, et d'autres qui peut ou pourrait être utile au noyau pour monter le vrai système de fichier racine root. Cette dernière est ensuite compressée avec gzip et est stockée au côté du noyau Linux qui est sous le nom "vmlinuz" dans /boot/ (pour de l'UEFI) ou à la racine / pour du BIOS.

vmlinuz ? 🤨

Oui, c'est le nom du binaire du noyau Linux, vmlinuz est compressé en Bzip (pour ma part). En réalité, vmlinuz cache un vmlinux qui est lui le binaire du noyau, (le z à la place du x de Linux c'est tout simplement pour préciser qu'il est compressé (zip) Je vous laisse lire cet article qui explique un peu ce que je vous explique ici, mais le plus intéressant étant "l'histoire" du nom "vmlinuz".

À quoi ressemble le contenu d'un initramfs

Voyons ça étape par étape (si jamais l'envie vous prend de regarder votre initramfs (si vous en avez un)).

D'abord on copie notre initramfs dans un dossier, dans/tmp pour jouer l'immersion à fond 🤓 (/tmp étant NORMALEMENT monté en tmpfs, comme le système de fichier connu de Linux et dans lequel sera extrait le contenu de notre initramfs)

Si vous exécutez la commande file sur votre initramfs, vous verrez :

initramfs-linux.img: Zstandard compressed data

Il faut donc le décompresser, avec l'outil zstd ou, comme moi, utiliser zstdcat pour afficher le contenu décompressé et envoyer la sortie (stdout) vers l'entrée (stdin) de cpio qui permet de désarchiver un fichier cpio.

Si vous n'êtes pas root, vous n'avez certainement pas le droit de lire le dit fichier, exécutez donc la commande si dessous avec sudo ou doas, ou alors donnez-vous les droits de lecture (avec chmod).

zstdcat initramfs-linux.img | cpio -i

Si la commande file vous retourne: is ASCII cpio archive (SVR4 with no CRC), c'est que votre initramfs a un microcode ajouté (rien de méchant). Effectuez ces commandes:

cpio -t < initramfs.img >/dev/null Cette commande va vous retourner la taille du microcode, pour pouvoir ensuite le passer avec la commande dd.

dd if=initramfs.img of=initramfs_no_microcode.img bs=512 skip=<OFFSET> (remplacer <OFFSET> par la taille du block retourné par la commande précédente).

Puis effectuez: zcat initramfs_no_microcode.img | cpio -i

Si vous listez le contenu de votre dossier vous verrez quelque chose de familier, une hiérarchie à la Unix avec les répertoires de base :

ilearned:/tmp   ls -l
total 8708
lrwxrwxrwx 1 ownesis ownesis       7 14 févr. 11:32 bin -> usr/bin
-rw-r--r-- 1 ownesis ownesis    2510 14 févr. 11:32 buildconfig
-rw-r--r-- 1 ownesis ownesis      64 14 févr. 11:32 config
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 dev
drwxr-xr-x 3 ownesis ownesis     160 14 févr. 11:32 etc
drwxr-xr-x 2 ownesis ownesis      60 14 févr. 11:32 hooks
-rwxr-xr-x 1 ownesis ownesis    2093 14 févr. 11:32 init
-rw-r--r-- 1 ownesis ownesis   13140 14 févr. 11:32 init_functions
lrwxrwxrwx 1 ownesis ownesis       7 14 févr. 11:32 lib -> usr/lib
lrwxrwxrwx 1 ownesis ownesis       7 14 févr. 11:32 lib64 -> usr/lib
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 new_root
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 proc
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 run
lrwxrwxrwx 1 ownesis ownesis       7 14 févr. 11:32 sbin -> usr/bin
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 sys
drwxr-xr-x 2 ownesis ownesis      40 14 févr. 11:32 tmp
drwxr-xr-x 5 ownesis ownesis     140 14 févr. 11:32 usr
drwxr-xr-x 2 ownesis ownesis      60 14 févr. 11:32 var
-rw-r--r-- 1 ownesis ownesis       2 14 févr. 11:32 VERSION

Je vous laisse vous balader dans les différents répertoires disponible. Par exemple dans bin qui pointe vers (usr/bin), vous verrez des outils comme :

  • bzip
  • mount
  • fsck.ext4
  • tftp qui a un article dédié ici 😜
  • lsmod
  • rmmod

Et beaucoup d'autres encore...

la plus part des outils présent dans initramfs sont disponible via un seul et même binaire qui est busybox

Processus de démarrage

On commence à partir du chargeur d'hamorcage (bootloader), GRUB par exemple.

  1. GRUB charge Linux et l'image initramfs dans la mémoire puis démarre le noyau (Linux).
  2. Linux vérifie la présence d'un initramfs, s'il en trouve il crée un système de fichier tmpfs et y extrait et monte l'initramfs.
  3. Dans ce même système de fichier (tmpfs), le noyau exécute le script init.
  4. Le script init monte le système de fichier racine root, en chargeant des modules du noyau utile pour le montage grace au différents scripts/programme et autres utilitaires présent dans l'initramfs (au besoin) et monte aussi les systèmes de fichiers comme /var et /usr.
  5. Une fois la racine monté, le script init commute la racine de tmpfs vers le système de fichier précédemment monté.
  6. Une fois la racine changée, le script init exécute le binaire /sbin/init pour continuer le processus de démarrage (en lançant des services/démons pour lancer le système).

Utilité d'un initramfs

Un initramfs n'est pas obligatoire, si on installe une distribution Linux qui permet de compiler sa propre version du noyau ainsi que sa configuration, une image initramfs n'est pas nécessaire, car le système est connu d'avance. Dans d'autres distributions, il y'a beaucoup d'inconnues pour le noyau, comme le type de système de fichiers par exemple, ce qui demande de charger certains modules dans le noyau ou d'avoir besoin de certains scripts/programmes. Généralement, ce sont les modules Linux qui pousse l'utilisation d'un initramfs.

Mais par exemple, imaginez une infrastructure ou tous les dossiers /home sont sur une autre machine, Linux est normalement incapable à lui tout seul de pouvoir se connecter à une machine distante sur le réseau de l'entreprise, pour ce faire, il utilise initramfs, qui possède toute une panoplie d'outils comme le paquet iproute, dhcp, mount, etc qui va permettre de monter un nfs (par exemple) depuis la machine distante qui partage les dossiers utilisateurs.

Conclusion

L'initramfs est un "mini" système de fichier compressé contenant toute une hiérarchie de système Linux avec des outils utiles pour le montage du système de fichier racine de votre machine, mais il n'est pas obligatoire.

bibliographie: - wiki.gentoo.org - fr.linuxfromscratch.org - wiki.debian.org - wiki.archlinux.org

Comment fonctionne le protocole FTP ?

Pour transférer des fichiers sur internet avant HTTP il existait un protocole qui se voulait assez simple : FTP (file transfer protocol).

FTP se base sur TCP, par défaut le serveur écoute le port 21. Le client FTP qui va se connecter au serveur envoie une commande FTP au serveur. Par exemple pour récupérer un fichier sur le serveur :

RETR example.txt

Pour transférer les données FTP utilise un second canal. Il a 2 modes de connexions pour ce canal, actif et passif.

En mode actif le client écoute sur un port précis, contacte le serveur FTP en lui disant de répondre sur le port et le serveur FTP initialise une connexion de données sur ce port.

Le souci avec ce mode de fonctionnement est qu’il ne fonctionne pas avec du NAT ou un pare-feu restrictif sur les connexions entrantes.

Les données envoyées par le serveur sont bloquées par le Firewall en mode passif

Un autre mode pour palier à ces soucis existe, le mode passif. Pour ce mode-là le client envoie la commande PASV, le serveur envoie alors en retour une IP et un numéro de port que le client utiliseras pour répondre. ss Les données ne sont pas bloquées par le firewall en mode actif

FTP demande par défaut une authentification, une parade utilisée pour permettre un accès au fichier par n’importe qui est le FTP anonyme. Le principe est d’utiliser l’utilisateur anonymous sans mot de passe pour accéder aux ressources.

Le protocole FTP souffre de nombreux problèmes de sécurités et est en voie de disparition. Par exemple de base FTP n’a aucun chiffrement, il y a cependant FTPS qui a vu son apparition, c’est simplement FTP au-dessus de TLS.

Comment fonctionne Wayland ?

L’affichage graphique d’un système d’exploitation est très complexe, si l’on veut avoir plusieurs fenêtre et application affichée en même temps en harmonie un logiciel qui gère les différents périphériques d’entrées et de sorties, l’isolation de chacun d’elle pour éviter qu’une application puisse récupérer les données d’une autre. Le but de cet article est d’essayer de comprendre le protocole Wayland qui vise à remplacer le vieillissant X11.

En résumer, Wayland (comme X11) sert à rajouter une couche d’abstraction pour les applications pour ne plus avoir à tout réinventer systématiquement.

Son mode de fonctionnement est client serveur. Le compositeur contrôle KMS et Evdev.

Evdev c’est la gestion des périphériques d’entrée sous Linux. Chaque périphérique se voit attribué dans /dev/input des fichiers qui permettent de recevoir les événements. Wayland utilise libinput (qui lui accède à evdev via libevdev) pour recevoir les entrées, la détection des nouveaux périphérique utilise udev. Le compositeur se charge d’envoyer au client les entrées. Une grosse avancée en sécurité par rapport à X11 est que les entrées ne sont pas envoyées à touts les clients, mais seulement celui concerné.

Pour la sortie vidéo chaque application envoie directement un buffer vidéo, un buffer c'est ce qui reçu par le gpu pour concevoir l’image le compositeur n’a plus qu’à assembler les différents buffers pour composer l’image finale, au compositeur, le compositeur s’occupe de gérer les fenêtres et de composer l’image complète avant de la renvoyer à KMS. KMS est le module kernel qui s’occupe de gérer l’affichage.

Schéma de l'architecture de Wayland

(source : https://wayland.freedesktop.org/architecture.html)

Le souci qui peut se poser est la rétrocompatibilité avec les applications X11, pour résoudre ce souci xwayland existe, c’est une couche de compatibilité. Xwayland s’occupe de faire un serveur X minimaliste pour les applications.

Xwayland est un intermédiaire entre les applications utilisant X11 et Wayland

(source : https://wayland.freedesktop.org/docs/html/ch05.html)

Les différents type de sauvegarde (Backup).

Est-ce que ça vous est déjà arrivé de vous dire :

"Si seulement je faisais des sauvegardes"

ou

"Heureusement que j'ai fais des sauvegardes"

Si vous avez connu ou connaissez toujours la première situation, cet article est fait pour vous. Peut-être vous ne savez pas comment faire, quelle stratégie adopter ou quel outil utiliser.

Dans cet article je vais vous présenter les 3 types de sauvegarde connus, comment ils fonctionnent, comment les réaliser/ mettre en place et quel outil sont à disposition pour le faire.

La sauvegarde complète

La sauvegarde complète, c'est la plus simple, vous sauvegardez la totalité d'un dossier ou d'un système de fichier. Vous vous en doutez, si votre disque ou dossier fais 500Go, il faudra sauvegarder les 500Go à chaque fois ce qui est peut-être plus ou moins long ; surtout si vous utilisez un cloud ou un serveur distant pour sauvegarder tout ça. Déjà, il y a la limite de stockage qui peut vous limiter, ou une bande passante limitée, une sauvegarde journalière ou hebdomadaire sera compliqué. Heureusement il reste 2 autres types de sauvegarde que je vais vous présenter.

La sauvegarde incrémentielle

Une sauvegarde incrémentielle commence par une sauvegarde complète et se basera ensuite sur la sauvegarde précédente pour comparer les fichiers à sauvegarder (vérifier si un fichier à été modifié/créé). Par exemple (pour une sauvegarde journalière) :

Le lundi, on effectue une sauvegarde complète (ça sera la seule et unique sauvegarde complète). Le mardi, on effectue une sauvegarde et comme dit plus haut, une sauvegarde incrémentielle se base sur la sauvegarde précédente pour comparer les fichiers, donc on utilisera la sauvegarde de lundi (qui est la sauvegarde complète) pour comparer les fichiers qu'on envoie, et la sauvegarde du mardi sera constitué seulement des fichiers qui on été modifiés ou créés depuis la dernière sauvegarde. Le mercredi, on se base toujours sur la dernière sauvegarde effectuée, cette fois ci on compare alors la sauvegarde de mardi. Et ainsi de suite...

Petit point important sur cette sauvegarde, si vous avez bien suivi, et je suis sûr que c'est le cas, vous êtes sûrement dit :

Mais attend, si la sauvegarde incrémentielle se base sur la sauvegarde précédente pour comparer les fichiers, si dans la sauvegarde du mardi, on a seulement 3-4 fichiers, la sauvegarde du mercredi va contenir tous les fichiers qu'on envoie SAUF les fichiers déjà présents dans la sauvegarde du mardi (ci ces fichiers n'ont pas étaient modifié).

Et vous avez raison ! Pour les 3 du fond qui n'ont pas compris ou qui ne se sont pas posé cette question, un schéma vaut mieux que 1000 mots :

Imaginons, nous sommes lundi et je compte sauvegarder mon dossier personnel qui contient ces fichiers-ci :

/home/ownesis/:
    - password.txt.gpg
    - fat.md
    - socks.md
    - 13_reasons_why_i_hate_ramle.txt
    - tftp.md
    - ipv4.md

Je sauvegarde tout ça dans /media/usb/backup_lundi (C'est la première sauvegarde, sauvegarde complète). /media/usb/backup_lundi contient alors exactement tous les fichiers contenus dans /home/ownesis/.

Le mardi, je modifie fat.md, et crée le fichier backup.md. De ce fait lors de la sauvegarde, seul ces deux fichiers cités plus haut seront sauvegardés dans /media/usb/backup_mardi.

/media/usb/backup_mardi:
    - fat.md
    - backup.md

Vient maintenant le mercredi, je modifie le fichier backup.md. Lors de la sauvegarde, il va donc comparer mon /home/ownesis/ actuel avec /media/usb/backup_mardi/. Et là, c'est le drame ! Dans /home/ownesis j'ai des fichiers qu'il n'y a pas dans /media/usb/backup_mardi, du coup, il va les sauvegarder, pareil pour les fichiers backup.md que j'ai modifié, il n'y a que fat.md qui lui a été inchangé qui ne sera pas dans /media/usb/backup_mercredi, et ça sera ce scénario pour toutes les sauvegardes suivantes, un jour sur deux il y aura seulement 2-3 fichiers et le lendemain tout le dossier sauf ces 2-3 fichiers de Hier (s'ils sont inchangés).

/media/usb/backup_mecredi:
    - password.txt.gpg
    - socks.md
    - 13_reasons_why_i_hate_ramle.txt
    - tftp.md
    - ipv4.md
    - backup.md

C'est totalement chaotique comme scénario, du coup pour remédier à ce problème, il existe deux solutions :

  • Copier à chaque fois les fichiers inchangés de la sauvegarde précédente dans la sauvegarde actuelle (mais ça risque de consommer beaucoup de place à la longue car ca reviendrait à faire une sauvegarde complète).
  • Utiliser des liens physiques sur les fichiers inchangés de la sauvegarde précédente dans la sauvegarde actuelle.

Un lien physique ?

Les Liens sous Unix et Unix like.

Pour faire simple il existe 2 types de liens - Lien physique. - Lien symbolique.

Un lien physique, c'est le fais de faire pointer un ou plusieurs noms de fichier vers le même inode d'un fichier.

Un inode ? quèsaco ?

Pour faire très court et simple, un inode est propre à un système de fichier Linux/Unix, chaque fichier a son propre inode, c'est un numéro unique qui identifie chaque fichier du système de fichier. Il est possible de voir l'inode d'un fichier avec la commande ls -i fichier, ou avec la commande stat fichier.

toto.txt -> inode: 69420
toto_phylink.txt -> inode: 69420

toto.txt et toto_phylink.txt pointent tous deux vers le même inode 69420, si je modifie le contenu de toto_phylink.txt je vais aussi modifier le contenu de toto.txt et inversement. Si je supprime un des noms de fichier, cela n'entraine pas la suppression du second, si plus aucun nom est associé a un inode, le fichier et donc "supprimé".

Fun fact: lorsqu'on "supprime" un fichier sous linux avec rm, celui ci utilise l'appel système unlink (2).

Il existe aussi les liens symboliques, ils ont le même rôle, faire un "alias" mais au lieu de pointer vers l'inode, ils pointent vers le nom du fichier qui pointe vers l'inode du fichier, exactement comme ferait un "raccourci" sous Windows.

toto.txt -> inode: 69420
toto_symlink.txt -> toto.txt

Il existe donc deux types de lien, le lien physique renvoie directement vers l'inode correspondant tandis que le lien symbolique renvoie vers le fichier d'origine.

Il est possible de créer de tel lien (physique et symbolique) avec la commande ln (1).

Bon, c'est bien beau tout ça mais en quoi ça va nous aider pour la sauvegarde incrémentielle ?

Lorsqu'on comparera les fichiers actuels avec la sauvegarde précédente, au lieu de sauvegarder que les fichiers modifiés/créés, on va aussi créer des liens physiques des fichiers inchangé présent dans la précédente sauvegarde dans la sauvegarde actuelle, ce qui permettra, pour la prochaine sauvegarde, de comparer la sauvegarde précédente, mais aussi les fichiers inchangés qui précèdent cette précédente sauvegarde, etc. Ceci va nous éviter de se retrouver dans la situation vu plus haut, car mercredi on ne comparera non plus les malheureux 2 petits fichiers de mardi avec les 7 fichiers actuels, mais les 2 fichiers + les 6 autres fichiers de la sauvegarde précédant la sauvegarde du mardi (le lundi donc).

Oui, 6 fichiers et non les 7, car le fichier fat.md est présent dans la sauvegarde de mardi.

Du coup la sauvegarde du mercredi, on se retrouve avec seulement le fichier backup.md qui a été modifié et 7 liens physiques qui pointent vers les mêmes inodes des fichiers de mardi.

Si on reprend exactement les mêmes scénarios de la sauvegarde de lundi, mardi et mercredi en employant l'astuce des liens physiques, on se retrouve avec ceci :

/media/usb/backup_lundi:
    - password.txt.gpg                  (inode 1)
    - fat.md                            (inode 2)
    - socks.md                          (inode 3)
    - 13_reasons_why_i_hate_ramle.txt   (inode 4)
    - tftp.md                           (inode 5)
    - ipv4.md                           (inode 6)


/media/usb/backup_mardi:
    - password.txt.gpg                  (inode 1)
    - socks.md                          (inode 3)
    - 13_reasons_why_i_hate_ramle.txt   (inode 4)
    - tftp.md                           (inode 5)
    - ipv4.md                           (inode 6)
    - fat.md                            (inode 7) <- ici le fichier a é modifié, donc nouvel inode.
    - backup.md                         (inode 8) <- ici, un nouveau fichier à é créé donc, nouvel inode aussi.

/media/usb/backup_mercredi:
    - password.txt.gpg                  (inode 1)
    - socks.md                          (inode 3)
    - 13_reasons_why_i_hate_ramle.txt   (inode 4)
    - tftp.md                           (inode 5)
    - ipv4.md                           (inode 6)
    - fat.md                            (inode 7)
    - backup.md                         (inode 10) <- ici, le fichier a é modifié, donc nouvel inode.

De ce fait, pour la sauvegarde de jeudi, on comparera la sauvegarde de mercredi avec les anciens fichiers qui ont toujours le même inode qui date de la sauvegarde de lundi, mais avec le fichier fat.md qui pointe vers l'inode 8 (créé dans la sauvegarde de mardi) et du fichier backup.md qui pointe vers l'inode 10 (créée dans la sauvegarde de mercredi). Et on économise de la place, car les fichiers inchangés ne sont pas copié mais "pointé/lié" grâce aux liens physiques.

Pfiou, on en a vu des choses tout ça juste pour faire une sauvegarde incrémentielle, mais courage, c'est bientot fini.

La sauvegarde différentielle

Une sauvegarde différentielle ressemble à la sauvegarde incrémentielle, mais ne paniquez pas, elle est beaucoup plus simple à comprendre. On commence aussi par effectuer une sauvegarde complète. Mais contrairement à la sauvegarde incrémentielle qui compare la dernière sauvegarde effectuée, la sauvegarde différentielle elle, se comparera toujours avec la première sauvegarde (la complète). Du coup, plus besoin de liens symboliques ou physiques vu qu'on se basera sur la même sauvegarde, on ne copiera que ce qui est nouveau ou modifié par rapport à la sauvegarde complète. Il est quand même possible d'utiliser des liens physiques avec ce type de sauvegarde, pour que les fichiers inchangés de la première sauvegarde (sauvegarde complète) soient "lié" dans la nouvelle, mais ça reste facultatif. Ce type de sauvegarde consomme plus de place que la sauvegarde incrémentielle, mais ça restera toujours moins que plusieurs sauvegardes complètes.

Différence entre sauvegarde différentielle et incrémentielle

Quelles sont donc leurs différences si au final, avec l'incrémentielle et les liens physiques, on se met à comparer la totalité d'une sauvegarde (comme la différentielle) ?

La seule différence, c'est que la différentielle se basera toujours sur la première sauvegarde complète et l'incrémentielle sur la sauvegarde précedente. Ce qui veux dire que dans le cas d'une différentielle, si on crée ou modifie un fichier, que ce soit le mardi, mercredi ou autres jours, ces fichiers seront toujours copiés (même si inchangé par la suite), car ils ne sont pas présents où sont différents par rapport à la première sauvegarde. Tandis que l'incrémentielle, les fichiers seront créer une fois et s'ils ne changent pas, lors de la prochaine sauvegarde, ils ne seront pas copiés mais "liés", car je le répète, l'incrémentielle se basera sur la dernière sauvegarde et non pas la première.

Outils mis à disposition

rsync, le meilleur outil de sauvegarde (selon moi), bon, il faut aimer la ligne de commande, RTFM et faire des scripts, mais si tout cela ne vous fait pas peur, je ne peux que vous le conseiller. Vous pouvez utiliser l'option --compare-dest=REP pour de la sauvegarde différentielle, en comparant votre sauvegarde complète REP. Ou l'option --link-dest=REP pour de la sauvegarde incrémentielle, il créera les liens physique tout seul en comparant le dossier REP.

Duplicati, je ne l'ai personnellement pas testé, mais j'ai vu que des bons retours dessus, il permet de faire de la sauvegarde complète et/ou incrémentielle.

borgbackup, pareille, je n'ai pas pu le tester (j'ai essayé, mais j'avais du mal avec son utilisation) mais il a l'air puissant il a beaucoup d'options et pareil j'ai eu de bon retours sur cet outil, il permet la sauvegarde incrémentielle et complète.

Sinon si vous êtes vieux jeu, pour de la sauvegarde complète, rien ne vaut le simple cp (1) pour de la sauvegarde local.

Voilà, c'est tout ! J'espère que vous avez apprécié cet article et que vous savez maintenant quel sont les possibles stratégies qu'on peut adopter pour gérer ces sauvegardes.

Quelques mentions honorables du scénario "j'aurais dû faire des backups..."

  • Ajouter un espace en trop lors d'un rm -rf et supprimer /var fichier.txt au lieu de /var/fichier.txt.
  • Formater la mauvaise partition... aïe.
  • Utiliser find (1) pour chercher des fichiers présents dans un répertoire en adéquation avec l'option -exec shred -zvu {} \; et utiliser le chemin / au lieu de .
  • Faire une option "clean" dans un Makefile, la tester et d'avoir supprimé les seuls et uniques fichiers source du projet.

Quelques mentions honorables du scénario "Heureusement je fais des backups"

  • Supprimer par mégarde, la totalité de son Windows.
  • Mauvaise manipulation de git.

Sources: it-connect, rsync (1)

C'est quoi un Active Directory

C'est quoi un Active Directory

Active Directory est un système au cœur des réseaux Windows et ce depuis 1996. Véritable incontournable de la sécurité informatique, il est devenu en quelques années une cible de choix pour les attaquants. Mais avant tout, il est nécessaire de comprendre ce qu’il est. Cet article destiné aux néophytes présentera, sans entrer dans trop de détails, comment il fonctionne.

Composants

Un active Directory est composé de trois services principaux :

  • Un DNS intégré.
  • Un serveur Kerberos.
  • Un serveur LDAP.

Le premier permet d’identifier clairement les machines dans un Active Directory en leur attribuant un nom. Ce nom dérive du nom du domaine, spécifié lors de la création d’un Active Directory (testlab.local par exemple)

Le second est un élément clé. En effet Kerberos permet d’authentifier les différents objets du domaine. Pour cela il procède par un système d’échange de tickets en 3 étapes, pour obtenir le ticket principal d’accès nommé TGT ("Ticket Granting Ticket"). En premier lieu, l’utilisateur par exemple, va effectuer une demande de d’authentification (KRB_AS_REQ) auprès du serveur d’authentification appelé KDC pour Key Distribution Center. Cette demande contient entre autres le hash NT (dans le langage de Kerberos il est aussi appelé RC4) de l’utilisateur, qui est un hash de son mot de passe (si vous voulez plus de détails sur l’algorithme utilisé, la fin de cet article vous éclairera). Puis ce dernier va retourner une réponse nommée AS_REP dans le cas où les identifiants sont valides, et cette réponse contiendra le TGT. Une fois ce fameux TGT obtenu, un utilisateur (ou une machine) s’en sert pour acquérir des TGS ("Ticket Granting Service") qui garantissent l’accès à un service sur une autre machine de l’environnement. Ces différents tickets ont un certain temps limite d’utilisation, une sorte de date de péremption qui est soigneusement réglée dans les paramètres de l’Active Directory. Pour ceux qui souhaiteraient plus de détails, je recommande chaudement cette article de Pixis.

fonctionnement de Kerberos

Le dernier élément est l’annuaire LDAP. Son rôle est aussi crucial que le second. Il centralise la base de données contenant tous les objets de l’Active Directory. Ainsi, il possède une architecture similaire à une arborescence partant de l’élément centrale de tout Active Directory, le domaine qui est traité en tant qu’objet (pour un domaine nommé testlab.local, l’arbre commence à DC=testlab,DC=lab). Chaque objet possède des propriétés qui sont exposées dans l’annuaire. Ainsi, il est une mine d’informations gigantesque et expose toutes les données nécessaires au bon fonctionnement de l’environnement. Que ce soient les GPOs qui sont en application sur le domaine, des ordinateurs ou d’autres objets. Entre ces derniers, il existe des relations de privilèges et de droits, qui sont des prolongements des ACLs et ACEs du modèle de sécurité de Windows (si ça vous dis rien, j’ai écris un article sur le sujet sur le blog de I Learned).

Ces services sont assurés par par un contrôleur de domaine qui est le cœur de l’environnement Active Directory. C’est à partir de lui qu’on déploie l’environnement.

Extension des domaines

Il existe une série de fonctionnalités très intéressantes qui sont mises à disposition par Active Directory. En premier lieu, les Contrôleurs de Domaine possèdent des rôles spécifiques (appelés FSMO). Chaque rôle leur permet d’assurer l’exposition d’un service clé, mais en plus avec un certain nombre de privilèges. Par exemple, l’un des rôles est le KDC que nous avons déjà vue, mais il en existe 4 autres que vous pouvez retrouver ici. La répartition de ces rôles permet un bénéfice énorme, un environnement Active Directory peut posséder plusieurs contrôleurs de domaine. Cela permet une plus grande souplesse en terme d’architecture (mais peut exposer dans le même temps plus de points faibles). En second lieu, pour que plusieurs domaines interagissent entre eux, il convient d’appliquer des « relations de confiances » entre ces domaines. De manière grossière, ils accordent aux utilisateurs certains droits dans un autre domaine (comme la lecture de l’annuaire). À remarquer qu’il n’est pas nécessaire que ces domaines aient une chose en commun, ils peuvent être différents en tous points.

Relation de confiance entre deux domaines

Il devient alors possible de combiner plusieurs domaines entre eux en un tout unique descendant d’un objet central. C’est ainsi que naissent les forêts. Par conséquent, il faut les voir comme des sortes « d’Active Directory d’Active Directory » où un domaine principal contient plusieurs sous-domaines enfants, donc différentes relations de confiances sont présentes entre ces différents sous-domaines. Les domaines deviennent donc des objets comme les utilisateurs par exemple, et des politiques très générales d’encadrement peuvent être déployées de manière très efficiente. Les ressources entre domaines différents sont désormais partagées, et des rôles de pouvoir spécifiques se mettent en place. L’exemple le plus flagrant est celui de l’Administrateur. En outre, dans un domaine unique, ce dernier est membre de trois groupes différents, bien sur, le groupe d’administrateurs local du contrôleur de domaine, le groupe « Domain Admins » et enfin le groupe « Enterprise Admins ». Ces deux groupes renvoient à deux choses différentes. Le premier concerne le domaine uniquement, alors que le second concerne la forêt dans son entièreté. Lorsque nous sommes dans une forêt, les mécanismes qui entrent en jeux sont les mêmes que dans un domaine, à la différence près que des objets d’un domaine externe peuvent interagir avec d’autres domaines. Ainsi, l’authentification Kerberos est partagée, et il en va de même pour l’annuaire LDAP.

Forêt

Vers plus de Cloud

L’une des plus grosses modifications récentes à cette architecture, est l’apport du Cloud. Le Cloud est une technologie révolutionnaire dans bien des domaines, entre autre le déploiement large de services et leur décentralisation, l’automatisation de plus en plus de tâches grâce au DevOps. C’est dans cette optique que Microsoft a pensé son infrastructure de Cloud nommé Azure. Bien sûr, comme à son habitude, Microsoft l’implémente à toutes les sauces, en premier lieu avec le DevOps (les pipelines Azure) et le stockage de données. Mais ils s’en sont également servi pour moderniser Active Directory en introduisant Azure Active Directory. Le concept en lui-même n’est pas bien différent de l’Active Directory standard, mais certains points de différences subsistent. Il n’y a plus de groupes mais des rôles, et les privilèges sont remplacés. Ils introduisent une décentralisation des applications notamment, et il existe un lien très fort entre un Active Directory standard et un Azure Active Directory, en outre ils peuvent être liés entre eux dans un même environnement.

Conclusion

J'espère que cet article vous a plu, si vous souhaitez aller plus loin, il existe énormément de ressources différentes, je pense notamment aux vidéos de Processus Thief, le blog de Pixis et de inf0sec (et éventuellement le mien) !

Comment fonctionne IPFS ?

Aujourd'hui la tendance est de plus en plus à la décentralisation, dans ce mouvement, a été créé le protocole IPFS (Interplanetary File System, rien que ça oui). C'est un protocole qui a pour objectif de stocker des fichiers de n'importe quel type (image, vidéo, document texte, site web...) de façon décentralisée.

Ce protocole fonctionne en paire à paire (P2P) afin de garantir une plus grande accessibilité des fichiers hébergés.

Un changement de paradigme

Aujourd'hui sur le web, quand on fait la requête HTTP GET https://ilearned.eu/static/img/favicon.webp on va demander au serveur à l'adresse ilearned.eu le fichier contenu dans le chemin /static/img/favicon.webp. Le serveur pourrait alors nous renvoyer le favicon que nous cherchons, ou n'importe quoi d'autre, comme une photo de chaton.

Avec HTTP, on demande le contenu à un emplacement, pas un fichier spécifique directement.

Avec IPFS c'est tout à fait différent, plutôt que d'aller demander le fichier contenu à l'emplacement /static/img/favicon.webp, on va demander le hash du fichier que nous souhaitons consulter.

Si je souhaite consulter le favicon d'I Learned, je vais demander le hash (appelé CID) QmfJpxjQezydRAswGezKs9qqqM1fFAjEZRgA4VdwwCNUsw. Je suis alors sûr de recevoir l'image que j'ai demandé, et pas une photo de chaton qui aurait un CID (hash) différent (ici, QmYKfEPmNbuN9mYYmPENvpNpQ6yQQ3d1EfynYNA6qPGjTA).

Comment accéder aux fichiers ?

Savoir représenter des fichiers, c'est bien beau, mais encore faut-il pouvoir y accéder 😅. Avec IPFS, chaque nœud du réseau ont une paire de clé qui leur permet d'échanger des informations de façon chiffrée, mais aussi d'être identifié. Tous les nœuds du réseau stockent une DHT (Distributed Hash Table, table de condensats distribuée) cette table met en relation les différents nœuds du réseau et les données qu'ils partagent, mais aussi leur multiadresse. Une multiadresse, c'est une chaine de caractère qui permet de renseigner directement comment contacter un nœud, par exemple /ip4/89.234.156.60/udp/1234 indique de contacter l'adresse IPv4 89.234.156.60 en utilisant le protocole UDP sur le port 1234.

Le client demande d'abord à la DHT, puis va se connecter aux pairs

IPNS

Du fait de son fonctionnement basé sur des hash au lieu de la localisation d'un fichier, IPFS souffre d'un problème majeur. Si vous souhaitez partager avec une amie un document texte, vous devriez donner à cette amie un nouveau lien à chaque fois que le fichier change, ne serait-ce que d'un caractère. Afin de répondre à cette problématique, IPNS (InterPlanetary Name System) a été créé.

Comme nous l'avons vu plus tôt, chaque nœud du réseau a une paire de clés qui lui est propre. Vous pouvez publier un fichier spécifique à l'emplacement /ipns/cléPublique grâce à l'outil de ligne de commande de IPFS. Il est possible de générer plusieurs clés afin d'avoir plusieurs "noms de domaines".

Vous pouvez donc maintenant simplement partager votre clé publique avec votre amie, et celle-ci pourra accéder au fichier texte que vous souhaitiez partager !

Il existe aussi la possibilité d'utiliser le système de DNS "classique" en ajoutant un record TXT à l'emplacement _dnslink.YOURNDD avec pour contenu dnslink=/ipfs/CID. Ainsi, ipfs.eban.eu.org est accessible depuis IPFS à partir de l'adresse /ipns/ipfs.eban.eu.org car il contient le record suivant :

_dnslink.ipfs.eban.eu.org. 1555 IN  TXT "dnslink=/ipfs/QmQS9TDSi8RmLzM6QFaRcCkdnqUbGpXsFDG1iuyXnx9brm"

J'espère que cet article sur IPFS vous aura plu, c'est un protocole que je trouve, à titre personnel, très intéressant et prometteur à beaucoup d'égards. Il est par exemple utilisé pour stocker un clone de Wikipédia de façon décentralisée afin d'assurer que tout le monde puisse y accéder n'importe quand. Ce genre d'initiative va dans le sens d'un internet plus décentralisé, et donc moins dépendant des grosses sociétés tech (les GAFAM).

TFTP, présentation et aperçu d'un protocole simple de transfert de fichier.

Aujourd'hui je vais vous présenter et vous parlez du protocole TFTP. J'imagine que vous pensez tout de suite au protocole FTP, et vous avez raison. TFTP signifie Trivial File Transfer Protocol.

Mais qu'est ce qu'il rajoute à FTP ?

Qu'est-ce qu'il enlève de FTP voulez-vous dire ? :eyes:

Oui, vous avez bien lu, TFTP, même si celui ci rajoute une lettre au protocole FTP, il retire une "plus ou moins importante" fonctionnalité a ce dernier. Il n'est pas possible d'exécuter des commandes, comme lister les fichiers, changer les droits des fichiers, se déplacer dans le système de fichier, etc. TFTP permet seulement de lire ou écrire sur le serveur distant, autrement dit, il permet seulement de récupérer ou envoyer (voir en créer dans certain cas) des fichiers (ou des courriers). Autre chose importante à savoir, il n'y a pas d'authentification des utilisateurs. Bon, vous l'aurez deviné, TFTP est un protocole de la couche application, il faut donc permettre le transport et c'est avec le protocole UDP que cela ce fait.

On utilise le protocole TFTP notamment pour la mise à jour des firmwares sur les équipements réseaux, la sauvegarde de la configuration de ces équipements réseau, mais aussi pour amorcer des stations de travail sans disque dur. C'en est tout pour la présentation de TFTP.

Maintenant rentrons dans le vif du sujet, voyons comment le protocole fonctionne : Pour commencer, le client demande une connexion au serveur TFTP, dans cette demande de connexion, le client précise si c'est pour de la lecture ou d'écriture de fichier. Le serveur accepte ou non la demande, si le serveur accepte, la connexion est de ce fait "ouverte" et le partage du fichier peut avoir lieu. Le bloc de donnée utilisé pour envoyer le fichier, que ce soit du côté client ou serveur, est d'une taille fixée à 512 octets, chaque paquet contient un bloc de données et doit être acquitté par un paquet d'accusé de réception avant l'envoie d'un prochain paquet. Pour signaler la fin d'un transfert, un paquet de données d'une taille inférieur à 512 octects doit être envoyé.

Si le client demande une connexion pour lire un fichier, il envoie l'OPcode RRQ ou l'OPcode WRQ pour écrire, le serveur envoie ensuite une réponse "positive", un accusé de réception pour acquitté la demande du client (si la demande est pour lire, le serveur envoie directement le bloc de données comme accusé de réception). Si un paquet se perd dans le réseau, le receveur sera alors mis en "timeout" et l'envoyeur devra réenvoyer le paquet. En général, un paquet d'accusé de réception contiendra le numéro de bloc du paquet de données reçu. Chaque paquet de données est associé à un numéro de bloc. Les numéros de bloc sont consécutives et le premier commence à 1. Lors d'une demande d'écriture (OPcode WRQ), l'accusé de réception à cette demande aura comme numéro de bloc de donnée 0.

Lors d'une création de connexion, chaque extrémité de la connexion choisit un TID (Transfer ID), une identification de transfert donc, pour lui-même. Les TID doivent être choisis au hasard. Chaque paquet est associé aux deux TID des extrémités de la connexion, le TID source et de destination. Ces TID sont remis à UDP comme ports source et destination. Le client, choisis sont TID (le port UDP) comme décrit ci-dessus et envoie sa requête initiale au TID 69 du serveur.

Vous l'aurez compris, le serveur TFTP écoute de base sur le port 69.

Lors de la réponse à la demande de connexion du client, le serveur choisis un TID (un autre port source), qui sera utilisé pour le reste de l'échange. À ce moment les deux extrémités de la connexion ont leurs propres TID et l'échange pour ce faire. Les hôtes doivent s'assurer que le TID source correspond toujours aux TID choisis. Si un TID ne correspond pas, le paquet doit être rejeté et un paquet d'erreur doit être envoyé à la source du paquet incorrect, sans perturber le transfert.

Paquet TFTP

TFTP prend en charge 5 types de paquets (OPcode) codé sur 2 octets, les voici: - 0x0001 RRQ (Demande de lecture) - 0x0002 WRQ (Demande d'écriture) - 0x0003 DATA (Données) - 0x0004 ACK (Accusé de réception) - 0x0005 ERR (Erreur)

Paquet de demande de lecture ou d'écriture

Le paquet RRQ/RWQ ressemble à ceci :

RRQ & RWQ headers

  • OPcode: 2 octets (0x0001 RRQ ou 0x0002 RWQ).
  • Nom de fichier : Taille variable, il correspond au nom/chemin du fichier.
  • 0: 1 octet, correspond à la fin de la chaine de caractère désignant le fichier.
  • Mode: Taille variable, voici les différents modes (insensible à la casse) :
    • 'netascii'
    • 'octet'
    • 'mail' (obsolète)
  • 0: 1 octet, correspond à la fin de la chaine de caractère désignant le Mode.

L'hôte qui reçoit le mode netascii, doit "traduire" les données dans son propre format (en modifiant la fin de ligne \r\n ou \n ou \n\r, ...) Le mode octet permet d'envoyer le fichier "tel quel".

Paquet de Données

Le paquet de Données (DATA) ressemble à ceci :

DATA header

  • OPcode: 2 octets (est mis à 0x0003 DATA).
  • # de bloc: 2octets Numéro de bloc.
  • Données: Taille variable, ce sont les données à envoyer

Le numéro de bloc commence à 1 et est incrémenté à chaque envoi. La taille des données est limité à un maximum de 512 octets, si le paquet de données n'est pas le premier et que la taille de la donnée et inférieur à 512 octets, cela correspond à la fin du fichier et du transfert.

Paquet d'acquittement

Le paquet d'accusé de réception (ACK) ressemble à ceci :

ACK header

  • OPcode: 2 octets (est mis à 0x0004 ACK).
  • # de bloc: 2 octets, correspond au numéro de bloc reçu.

Si la demande du client est une demande d'écriture (OPcode 0x0002), Le serveur acquitte la demande avec le numéro de bloc 0x0000.

Paquet d'Erreur

Le paquet d'erreur (ERR) ressemble à ceci:

ERR header

  • OPcode: 2 octets (est mis à 0x0005 ERR).
  • ErrCode: 2octets, correspond aux codes erreur suivant:
    • 0x0000 Non défini, voir le message d'erreur (le cas échéant).
    • 0x0001 Fichier introuvable.
    • 0x0002 Violation d'accès.
    • 0x0003 Disque plein ou allocation dépassée.
    • 0x0004 Opération TFTP illégale.
    • 0x0005 ID de transfert inconnu.
    • 0x0006 Le fichier existe déjà.
    • 0x0007 Aucun utilisateur de ce type.
  • ErrMsg: Taille variable, correspond a une chaine de caractère définissant le code d'erreur.
  • 0: 1 octet: Spécifie la fin de la chaine de caractère ErrMsg.

Exemple de connexion et de transfert

Voici un exemple de connexion et de récupération de fichier :

HostA récupère le fichier file.txt d'une taille de 920 octets sur HostB qui héberge un serveur TFTP.

Exchange schema

HostA:4242 (OPcode=RRD; file=file.txt; mode=netascii)  --> HostB:69
HostB:9090 (OPcode=DATA; BLOCK=1; [512 bytes data...]) --> HostA:4242
HostA:4242 (OPcode=ACK; BLOCK=1) --> HostB:9090
HostB:9090 (OPcode=DATA; BLOCK=2; [408 bytes data...]) --> HostA:4242
HostA:4242 (OPcode=ACK; BLOCK=2) --> HostB:9090

Ici, 4242 et 9090 correspond au TID/Port UDP de HostA et HostB respectivement.

Serveur / Client TFTP

Vous pouvez télécharger le daemon tftpd et le client tftp avec les paquets suivant: tftpd-hpa et tftp-hpa. Le client Curl intègre aussi le protocole TFTP: Upload: curl -T file.txt tftp://HOST Donwload: curl -o file.txt tftp://HOST/FILE

Voilà, c'est fini j'espère que cet article vous a plu et que vous avez compris l'utilité et le fonctionnement de TFTP.

Conclusion

TFTP est donc un protocole simple permettant uniquement le transfert (et la création dans certain cas) de fichier, il fonctionne sur UDP. Il ne propose pas d'authentification, ni de chiffrement (mais il est possible de passer par un serveur SOCKS, donc Tor :eyes:). C'est une sorte de FTP plus léger et plus simple à programmer/mettre en place, il ne permet pas l'exécution de commande, mais seulement le transfert de fichier. Contrairement aussi à FTP, il n'y a pas de mode dit "passive" ou "active", vu que le protocole utilise UDP. Le choix de ce protocole de transport permet aussi une meilleure rapidité, même si les limites de taille de bloc sont limité à 512 octet, en moyenne, en partant du principe que l'entête IPv4 n'a pas d'option, la taille MAXIMUM THÉORIQUE (ma théorie) ne devrait pas dépasser les 558 octets:

  • Trame Ethernet : 14 octets
  • Entête IPv4 : 20 octets
  • Entête UDP : 8 octets
  • Entête TFTP: 516 octets (OPcode + # bloc + bloc maxi)

Total: (14 + 20 + 8 + 516) = 558

UDP ajoute la rapidité, mais le fait que la taille des blocs est limitée à 512 octets, qu'entre chaque envoi de bloc il faut attendre l'accusé de réception et, qui plus est, que l'accusé de réception ou le bloc de données peut se perdre dans le réseau, la durée peut varier, surtout pour des fichiers volumineux (ces problèmes là peuvent intervenir aussi avec TCP, mais celui-ci reste beaucoup plus fiable).

Source: RFC 1350 - doc. Ubuntu

❌
❌