The Senegal international, who emerged through Paris Saint-Germain's academy and has also previously represented Lille, is reported to have cost Milan an initial €4.2million.
Former France youth player Ballo-Toure joined Monaco from fellow Ligue 1 side Lille in January 2019 and made 74 appearances for Les Monegasques in all competitions. That includes 24 outings in Ligue 1 last season, albeit just six of those being starts.
He ranked particularly highly for crosses, with his average of 5.4 balls played into the box per 90 minutes bettered only by Sebastien Corchia (5.9), Leo Dubois (6.6) Clement Michelin (6.6) and Jonathan Clauss (7.7) among defenders to have played more than twice in Ligue 1 last season.
Ballo-Toure has been handed the number five jersey at San Siro and is expected to rival Theo Hernandez for a starting spot under Stefano Pioli this coming season.
Milan confirmed Ballo-Toure's arrival on their official website on Sunday, the 24-year-old becoming their fifth signing of the close season.
The Rossoneri have also brought in Mike Maignan and Olivier Giroud, while Fikayo Tomori and Sandro Tonali had their respective loan deals made permanent.
Pioli's side, whose second-place finish last season was their highest since 2011-12, kicked off their pre-season programme with a 6-0 win over Pro Sesto on Saturday.